每小时人数

时间:2018-10-03 20:07:52

标签: sql

我需要一些帮助,以确定每小时有多少人在现场。

数据看起来像这样

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函数。

1 个答案:

答案 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