我正在使用 SQL Server 2012。我有一个非常大的数据库,其中包含超过 4000 万条用于邮件投递的 GPS 轨迹记录。我想知道 postman 停了多长时间。所以,当承运人的距离登记为 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
最佳答案
您可以将组定义为任何给定值之前的非零值的累积计数。然后您可以使用该组作为累计和。
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;
关于sql - 基于连续值的累计和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22775434/