sql - 获取行值直到相同的条件出现在sql中的记录中

标签 sql mariadb

id | amount
-----------
1  | 100  |
2  | 0    |
3  | 0    |
4  | 200  |
5  | 0    |
6  | 0    |

我有这个表,其中值列将频繁出现大于 0 的值。我正在尝试找出一个 SQL 查询,该查询将打印第一个大于 0 的值和第二个大于 0 的值之间的值。

对于上表,输出将为

id | amount
-----------
1  | 100  |
2  | 0    |
3  | 0    |

我不知道需要什么样的条件才能实现这一目标。我尝试过Group By,但它只计算相同值的总数。

我还考虑给每个值一个唯一的数字,如下所示

id | Serial number | amount
---------------------------
1  |       1       | 100  |
2  |       1       | 0    |
3  |       1       | 0    |
4  |       1       | 200  |
5  |       1       | 0    |
6  |       1       | 0    |

但是我再次无法通过查询显示数据,因为我对如何执行此操作感到困惑。

最佳答案

类似这样的事情:

WITH v AS (
 SELECT *, SUM(amount) OVER(ORDER BY id ASC) sum_amount, MAX(amount) OVER(ORDER BY id ASC) max_amount
 FROM t
)
SELECT id, amount
FROM v
WHERE sum_amount > 0 AND sum_amount = max_amount

Demo

看看这个查询

 SELECT *, SUM(amount) OVER(ORDER BY id ASC) sum_amount, MAX(amount) OVER(ORDER BY id ASC) max_amount
 FROM t

结果集:

+----+--------+------------+------------+
| id | amount | sum_amount | max_amount |
+----+--------+------------+------------+
|  1 |    100 |        100 |        100 |
|  2 |      0 |        100 |        100 |
|  3 |      0 |        100 |        100 |
|  4 |    200 |        300 |        200 |
|  5 |      0 |        300 |        200 |
|  6 |      0 |        300 |        200 |
|  7 |      0 |        300 |        200 |
|  8 |    300 |        600 |        300 |
|  9 |      0 |        600 |        300 |
+----+--------+------------+------------+
窗口函数中的

SUMMAX将根据ORDER BY id ASC计算当前行的值

  • sum_amount > 0 查找金额大于零的第一行
  • sum_amount = max_amount 排除金额大于零的另一行及其之后的行,因为到达此类行时,总和始终大于 max

关于sql - 获取行值直到相同的条件出现在sql中的记录中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70213436/

相关文章:

mysql - 如何在每次 MySQL 初始化时运行 SQL 脚本?

sql - 如何根据组变化查找同一列中两个日期之间的差距

php - 在 MySQL 的 TRANSACTION block 之外运行插入

mysql - 在加入 Sql 之间时如何用例

mysql - 在 WHERE 子句中使用 CASE

mysql - 在 maria db(mysql) 中按顺序和分组进行选择

python - 从 Python 运行 SQL 文件

mysql - 在 MySQL InnoDB 中替换为表非常慢

mysql - 获取两个不同过程的总和

c# - 如何使用实用程序类管理 SQL 连接?