获取所有不同的值并按小时对它们进行排序
Getting all distinct values and sorting them by hour
我有以下 table:
ID TimeStamp CarNumber
1 2018 14:05:32 433
2 2018 14:13:52 420
3 2018 14:55:14 433
4 2018 15:12:03 420
5 2018 16:15:55 570
我想要的输出是一天中每个小时的每个车号的列表:
Hour CarNumbers
0 0
...
14 433, 420
15 420
16 570
...
我正在使用 SQL Server 2008,所以我无法使用 string_agg()。有办法吗?
SELECT DATEPART(HOUR, Timestamp), STUFF(
(SELECT ',' + carnumber
FROM tablename t1
FOR XML PATH (''))
, 1, 1, '') carnumbers
from tablename
group by DATEPART(HOUR, Timestamp) asc ;
要获取所有时间的计数,您需要左键加入包含所有时间的列表。
如果它们跨越超过 1 个日期,则可能与时间戳的日期相结合。
要替换缺失的 STRING_AGG
,您可以使用 FOR XML
技巧。
示例片段:
-- Using a table variable for demonstration
declare @Table table (id int primary key identity(1,1), [Timestamp] datetime, CarNumber int);
-- Sample data
insert into @Table ([Timestamp], CarNumber) values
('2018-12-03 14:05:32', 433),
('2018-12-03 14:13:52', 420),
('2018-12-03 14:55:14', 433),
('2018-12-03 15:12:03', 420),
('2018-12-03 16:15:55', 570),
('2018-12-09 14:00:00', 999);
-- Query
WITH RCTE_HOURS AS
(
select 0 as [Hour]
union all
select [Hour] + 1
from RCTE_HOURS
where [Hour] < 23
)
SELECT h.[Hour],
COALESCE(STUFF((
SELECT ', ' + CONVERT(VARCHAR(10), CarNumber)
FROM @Table t2
WHERE CAST(t2.[Timestamp] AS DATE) = d.[Date]
AND DATEPART(HOUR, t2.[Timestamp]) = h.[Hour]
AND CarNumber IS NOT NULL
GROUP BY CarNumber
ORDER BY MIN(t2.[Timestamp])
FOR XML PATH ('')
), 1, 2, ''),'0') AS CarNumbers
FROM
(
SELECT DISTINCT CAST([Timestamp] AS DATE) AS [Date]
FROM @Table
WHERE CAST([Timestamp] AS DATE) = CAST('2018-12-03' AS DATE)
) AS d
CROSS JOIN RCTE_HOURS h
ORDER BY d.[Date], h.[Hour];
Returns:
Hour CarNumbers
---- ----------
0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0
10 0
11 0
12 0
13 0
14 433, 420
15 420
16 570
17 0
18 0
19 0
20 0
21 0
22 0
23 0
我有以下 table:
ID TimeStamp CarNumber
1 2018 14:05:32 433
2 2018 14:13:52 420
3 2018 14:55:14 433
4 2018 15:12:03 420
5 2018 16:15:55 570
我想要的输出是一天中每个小时的每个车号的列表:
Hour CarNumbers
0 0
...
14 433, 420
15 420
16 570
...
我正在使用 SQL Server 2008,所以我无法使用 string_agg()。有办法吗?
SELECT DATEPART(HOUR, Timestamp), STUFF(
(SELECT ',' + carnumber
FROM tablename t1
FOR XML PATH (''))
, 1, 1, '') carnumbers
from tablename
group by DATEPART(HOUR, Timestamp) asc ;
要获取所有时间的计数,您需要左键加入包含所有时间的列表。
如果它们跨越超过 1 个日期,则可能与时间戳的日期相结合。
要替换缺失的 STRING_AGG
,您可以使用 FOR XML
技巧。
示例片段:
-- Using a table variable for demonstration
declare @Table table (id int primary key identity(1,1), [Timestamp] datetime, CarNumber int);
-- Sample data
insert into @Table ([Timestamp], CarNumber) values
('2018-12-03 14:05:32', 433),
('2018-12-03 14:13:52', 420),
('2018-12-03 14:55:14', 433),
('2018-12-03 15:12:03', 420),
('2018-12-03 16:15:55', 570),
('2018-12-09 14:00:00', 999);
-- Query
WITH RCTE_HOURS AS
(
select 0 as [Hour]
union all
select [Hour] + 1
from RCTE_HOURS
where [Hour] < 23
)
SELECT h.[Hour],
COALESCE(STUFF((
SELECT ', ' + CONVERT(VARCHAR(10), CarNumber)
FROM @Table t2
WHERE CAST(t2.[Timestamp] AS DATE) = d.[Date]
AND DATEPART(HOUR, t2.[Timestamp]) = h.[Hour]
AND CarNumber IS NOT NULL
GROUP BY CarNumber
ORDER BY MIN(t2.[Timestamp])
FOR XML PATH ('')
), 1, 2, ''),'0') AS CarNumbers
FROM
(
SELECT DISTINCT CAST([Timestamp] AS DATE) AS [Date]
FROM @Table
WHERE CAST([Timestamp] AS DATE) = CAST('2018-12-03' AS DATE)
) AS d
CROSS JOIN RCTE_HOURS h
ORDER BY d.[Date], h.[Hour];
Returns:
Hour CarNumbers
---- ----------
0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0
10 0
11 0
12 0
13 0
14 433, 420
15 420
16 570
17 0
18 0
19 0
20 0
21 0
22 0
23 0