[英]How to sum a group of rows in SQL?
我有一张像这样的桌子
ID Customer TimeStamp Occ
14488 5130 2016-05-11 11:16:52.740 3
114304 5130 2016-05-11 11:01:51.263 3
114156 5130 2016-05-11 10:46:49.943 3
113971 5130 2016-05-11 10:31:49.857 5
113790 5130 2016-05-11 10:16:49.510 6
113605 5130 2016-05-11 10:01:48.643 1
113419 5130 2016-05-11 09:46:46.843 3
113234 5130 2016-05-11 09:31:46.643 2
113052 5130 2016-05-11 09:16:45.403 2
112867 5130 2016-05-11 09:01:44.193 9
112681 5130 2016-05-11 08:46:42.220 8
112493 5130 2016-05-11 08:31:38.327 3
112305 5130 2016-05-11 08:16:37.220 2
112122 5130 2016-05-11 08:01:37.147 8
111936 5130 2016-05-11 07:46:35.933 5
111747 5130 2016-05-11 07:31:34.457 5
我要做的是合并此表中的行,一行四乘四,并对发生的行求和。 如果我可以打印合并的4行的最早和最新的时间戳,也将非常好。 输出将是这样的:
ID Customer Last TimeStamp EarliestTimeStamp Sum Occ
1 5130 2016-05-11 11:16:52.740 2016-05-11 10:31:49.857 14 //Sum of the first 4 rows (3+3+3+5)
2 5130 2016-05-11 10:16:49.510 2016-05-11 09:31:46.643 12 //Sum of the first 4 rows (6+1+3+2)
有什么办法可以用SQL做到这一点?
with cte as
(
select row_number() over (partition by customer order by timestamp desc) as sNo,*
from tab
)
select customer,max(timestamp) as last_timestamp, min(timestamp) as EarliestTimeStamp, sum(occ) as [Sum occ]
from cte
group by sno/4,customer
查询
SELECT ID, Customer, TimeStamp, Occ,
(SELECT 1+FLOOR(COUNT(1)/4) FROM table1 it
WHERE ot.Customer=it.Customer AND it.TimeStamp<ot.TimeStamp) AS seq
FROM table1 as ot
将添加一个序列号-前4个标记为1,后4个标记为2等等。请注意,函数FLOOR将浮点数截断为整数-在数据库中可能称为INT。
ID Customer TimeStamp Occ seq
14488 5130 2016-05-11 11:16:52.740 3 1
114304 5130 2016-05-11 11:01:51.263 3 1
114156 5130 2016-05-11 10:46:49.943 3 1
113971 5130 2016-05-11 10:31:49.857 5 1
113790 5130 2016-05-11 10:16:49.510 6 2
113605 5130 2016-05-11 10:01:48.643 1 2
113419 5130 2016-05-11 09:46:46.843 3 2
113234 5130 2016-05-11 09:31:46.643 2 2
然后,您可以相对容易地获得最大值和最小值以及总和:
SELECT seq, Customer, min(TimeStamp), max(TimeStamp), SUM(occ)
FROM (
SELECT ID, Customer, TimeStamp, Occ,
(SELECT 1+FLOOR(COUNT(1)/4) FROM table1 it WHERE ot.Customer=it.Customer and it.TimeStamp<ot.TimeStamp) AS seq
FROM table1 as ot
) AS dt
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.