繁体   English   中英

如何在SQL中汇总一组行?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM