如何计算自一天开始以来每小时的聚合不同 ID?

how to count aggregate distinct IDs Per Hour Since Beginning of the day?

我需要编写一个查询,计算不同的 ID 并随时间聚合它们。

例如

结果应该是

对于每个id,记录id第一次出现的时间,然后做一个累加和:

select hour, sum(count(*)) over (partition by day order by hour)
from (select day, id, min(hour) as hour
      from t
      group by day, id
     ) t
group by hour
order by hour;

注意:这假设您确实想要在给定的一天内有一个小时。

您也可以表示为:

select day, hour, sum(cnt) over (partition by day order by hour)
from (select day, hour, count(*) as cnt
      from (select day, id, min(hour) as hour
            from t
            group by day, id
           ) t
      group by hour
     ) h
order by hour;

以上不会包括一个小时,除非那个小时有一个新的id。对于所有时间,您可以改用 window 函数:

select hour,
       sum(sum( (seqnum = 1)::int ) over (partition by day order by hour)
from (select day, id,
             row_number() over (partition by day, id order by hour) as seqnum
      from t
     ) t
group by hour
order by hour;

您也可以表示为:

select day, hour, sum(cnt) over (partition by day order by hour)
from (select day, hour, sum( (seqnum = 1)::int ) as cnt
      from (select day, id,
                   row_number() over (partition by day, id order by hour) as seqnum
            from t
           ) t
      group by hour, day
     ) dh
order by hour;

我每小时的计数不同。

declare @tmp as table(RecordNumber int, Day date, Hour int, ID int)
insert into @tmp(RecordNumber,Day,Hour,ID) values(1,'4/27/2021',1,100),
(2,'4/27/2021',1,100)
,(3,'4/27/2021',1,101)
,(4,'4/27/2021',2,202)
,(5,'4/27/2021',2,203)
,(6,'4/27/2021',3,101)
,(7,'4/27/2021',8,305)
,(8,'4/27/2021',16,100)
,(9,'4/27/2021',22,30)
,(10,'4/27/2021',22,1000)
,(11,'4/27/2021',23,100)
,(12,'4/27/2021',23,50)


select distinct Day, Hour, count(distinct ID) ID_Count from @tmp
group by Day, Hour

输出

 Hour   ID_Count
   1    2
   2    2
   3    1
   8    1
  16    1
  22    2
  23    2