我有下表:
ID TimeStamp CarNumber
1 2018\12\03 14:05:32 433
2 2018\12\03 14:13:52 420
3 2018\12\03 14:55:14 433
4 2018\12\03 15:12:03 420
5 2018\12\03 16:15:55 570
我想要的输出是一天中每个小时的每个车号的列表:
Hour CarNumbers
0 0
...
14 433, 420
15 420
16 570
...
我正在使用SQL Server 2008,所以不能使用string_agg()。有办法吗?
答案 0 :(得分: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];
返回:
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
答案 1 :(得分:0)
SELECT DATEPART(HOUR, Timestamp), STUFF(
(SELECT ',' + carnumber
FROM tablename t1
FOR XML PATH (''))
, 1, 1, '') carnumbers
from tablename
group by DATEPART(HOUR, Timestamp) asc ;