首页 > 解决方案 > 如何在 SQL 中满足条件之前对行求和

问题描述

我有一个表,其中有多个相同 ID 的记录。看起来像这样,并且行按序号排序。

+----+--------+----------+----------+
| id | result | duration | sequence |
+----+--------+----------+----------+
| 1  | 12     | 7254     | 1        |
+----+--------+----------+----------+
| 1  | 12     | 2333     | 2        |
+----+--------+----------+----------+
| 1  | 11     | 1000     | 3        |
+----+--------+----------+----------+
| 1  | 6      | 5        | 4        |
+----+--------+----------+----------+
| 1  | 3      | 20       | 5        |
+----+--------+----------+----------+
| 2  | 1      | 230      | 1        |
+----+--------+----------+----------+
| 2  | 9      | 10       | 2        |
+----+--------+----------+----------+
| 2  | 6      | 0        | 3        |
+----+--------+----------+----------+
| 2  | 1      | 5        | 4        |
+----+--------+----------+----------+
| 2  | 12     | 3        | 5        |
+----+--------+----------+----------+

例如id=1,我想将之前所有行的持续时间相加并包含result=6,即7254+2333+1000+5。相同的id =2,它会的230+10+0。行之后的任何内容result=6都将被忽略。

我的预期输出:

+----+----------+
| id | duration |
+----+----------+
| 1  | 10592    |
+----+----------+
| 2  | 240      |
+----+----------+

顺序必须按升序排列。

我不确定如何在 sql 中执行此操作。先感谢您!

标签: sqlpresto

解决方案


您可以使用带有条件的简单聚合查询,该条件使用子查询来恢复sequence与序列为 的记录对应的记录6

SELECT t.id, SUM(t.duration) total_duration
FROM mytable t
WHERE t.sequence <= (
    SELECT sequence
    FROM mytable
    WHERE id = t.id AND result = 6
)
GROUP BY t.id

DB Fiddle上的这个演示与您的测试数据返回:

| id  | total_duration |
| --- | -------------- |
| 1   | 10592          |
| 2   | 240            |

推荐阅读