如何计算自一天开始以来每小时的聚合不同 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
我需要编写一个查询,计算不同的 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