基于连续值的累积和

时间:2014-04-01 01:55:56

标签: sql sql-server tsql sql-server-2012 cumulative-sum

我正在使用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

1 个答案:

答案 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;