sql - 如何在 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 中执行此操作。先感谢您!
解决方案
您可以使用带有条件的简单聚合查询,该条件使用子查询来恢复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 |
推荐阅读
- linux - 我可以在 Linux 下使用 Qt Creator 上的 Alt+Tab 禁用自动完成功能吗?
- java - H2 数据库中@GeneratedValue 的问题
- node.js - discord.js EvaluatedPermissions 其他解决方案
- excel - 如果在单元格中选择了值,则为 Msgbox
- php - 没有得到数组 - PHP JSON Explode
- android-source - Aosp 下载问题
- sapui5 - 如何在 SAP Ui5 中添加验证,在输入字段中,用户端必须仅输入具有相应最大长度和最小长度的数字,
- javascript - 如何根据javascript中的对象属性对数据进行分组?
- c# - Xamarin.Forms 重新加载集合视图
- android - 如何获得变量反应原生