我需要一些帮助,以确定每小时有多少人在现场。
数据看起来像这样
Id Roomid, NumPeople, Starttime, Closetime.
1 1 4 2018/10/03 09:06 2018/10/03 12:43
2 2 8 2018/10/03 10:16 2018/10/03 13:12
3 1 6 2018/10/03 13:02 2018/10/03 15:01
我需要的是每小时一个小时内的最大人数
Time | PeoplePresent
9 4
10 12
11 12
12 12
13 14
14 6
15 6
获取到达人数是很简单的,但是我无法想象每个小时从哪里开始出现。谁能为此建议一个策略。我可以使用简单的SQL工具,但是我确定这需要一些高级SQL函数。
答案 0 :(得分:0)
在SQL Server 2008 R2中测试了以下内容:
您可以使用递归CTE来构建小时数列表,包括行ID和NumPeople值。然后,您可以将它们加在一起以获得最终输出。我根据该问题整理了以下测试数据。
Dataframe1 <- read.table(text="ID Date Indicator
12345 01/01/2008 1
54321 12/01/2008 1", stringsAsFactors = F, header = T)
Dataframe2 <- read.table(text="ID Date
12345 01/01/2008
12345 01/31/2008
12345 02/28/2009
24681 01/01/2008
54321 12/01/2008
54321 12/20/2008",stringsAsFactors = F, header = T)
查询结果:
CREATE TABLE #times
(
Id int
, Roomid INT
, NumPeople INT
, Starttime DATETIME
, Closetime DATETIME
)
INSERT INTO #times
(
Id
,Roomid
,NumPeople
,Starttime
,Closetime
)
VALUES
(1, 1, 4 , '2018/10/03 09:06', '2018/10/03 12:43')
,(2, 2, 8, '2018/10/03 10:16', '2018/10/03 13:12')
,(3, 1, 6, '2018/10/03 13:02', '2018/10/03 15:01')
;WITH recursive_CTE (id, startHour, currentHour, diff, NumPeople) AS
(
SELECT
Id
,startHour = DATEPART(HOUR, t.Starttime)
,currentHour = DATEPART(HOUR, t.Starttime)
,diff = DATEDIFF(HOUR, Starttime, Closetime)
,t.NumPeople
FROM #times t
UNION ALL
SELECT
r.id
,r.startHour
,r.currentHour + 1
,r.diff
,r.NumPeople
FROM recursive_CTE r
WHERE r.currentHour < startHour + diff
)
SELECT
Time = currentHour
,PeoplePresent = SUM(NumPeople)
FROM recursive_CTE
GROUP BY currentHour
DROP TABLE #times