sql - 基于连续值的累计和

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

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

相关文章:

sql - 日期范围的最小值或最大值 - 根据产品 ID、价格和日期范围确定给定日期范围的最低价格

mysql - 将表中的两个时间范围合并为一个

sql-server - 如何使用 SQL Server 在 azure 存储 blob 中创建文件

c# - 将多行插入 MS SQL Server 并检索所有新表 ID 的背面

sql-server-2008 - 消息102,级别15,状态1,行1'<'附近的语法不正确

sql - XQuery:查找包含指定 xml 数据的行

sql - 具有多个变量的 T-SQL SELECT

SQL Server 过滤索引 - 谁能解释我看到的这个错误?

sql - 在 Windows 服务中使用 SQL LocalDB

mysql - 在 phpmyadmin 中的表中插入值时如何进行制表符间距?