【问题标题】:Cumulative sum based on consecutive values基于连续值的累积和
【发布时间】:2014-05-11 14:38:41
【问题描述】:

我使用的是 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

【问题讨论】:

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


    【解决方案1】:

    您可以将组定义为在任何给定值之前的非零值的累积计数。然后,您可以将该组用于累积总和。

    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;
    

    【讨论】:

    • 感谢您的快速回复。我尝试在我的数据集上运行它,并且 StopTime 中的所有值都返回为 Null。在 partition by 语句中,我将 'by group' 更改为 'by grp'。
    • @hurlski 。 . .我有错误的case 条件。它应该在distance
    • 。这可行,但它在计算中包括了上一个移动记录中的 time_s:here's my result 有没有办法告诉它跳过一行然后开始求和以仅包括距离为 0 的时间?
    • @hurlski 。 . .好点子。条件总和解决了这个问题。
    猜你喜欢
    • 2018-04-09
    • 2021-01-04
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    相关资源
    最近更新 更多