我正在使用SQL Server 2012.我有一个非常大的数据库,包含超过4000万条用于邮件传递的GPS轨道记录。我希望能够弄清楚信件载体已停止多长时间。因此,当运营商的距离注册为0,并且每次连续0跟随时,我想知道停止的累计时间。我还希望在注册任何高于0的值时停止求和,并在注册0时再次启动。这是我到目前为止所得到的:
SELECT
CASE
WHEN Distance = 0 THEN SUM(Time_s) OVER (ORDER BY [ID] ROWS UNBOUNDED PRECEDING)
WHEN Distance <0 THEN NULL
END as StopTime
FROM data
ORDER BY ID
结果如下:
ID Distance Time_s StopTime
1 6 899 NULL
2 0 789 1688
3 16 740 NULL
4 0 70 2498
5 0 50 2548
6 0 585 3133
7 0 10 3143
8 5 329 NULL
9 6 394 NULL
10 0 570 4436
我显然没有告诉查询每次连续零点被大于零的任何一个中断时再次开始计数。这是我想要的结果:
ID Distance Time_s StopTime
1 6 899 NULL
2 0 789 789
3 16 740 NULL
4 0 70 70
5 0 50 130
6 0 585 715
7 0 10 725
8 5 329 NULL
9 6 394 NULL
10 0 570 570
答案 0 :(得分:2)
您可以将组定义为任何给定值之前的非零值的累积计数。然后,您可以将该组用于累积总和。
select d.id, d.distance, d.time_s,
(case when d.distance = 0
then sum(case when d.distance = 0 then d.time_s end) over (partition by grp order by id)
end) as StopTime
from (select d.*,
sum(case when distance = 0 then 0 else 1 end) over (order by id) as grp
from data d
) d;