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
看看这个查询
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 |
+----+--------+------------+------------+
窗口函数中的SUM
、MAX
将根据ORDER BY id ASC
计算当前行的值
sum_amount > 0
查找金额大于零的第一行sum_amount = max_amount
排除金额大于零的另一行及其之后的行,因为到达此类行时,总和始终大于 max
关于sql - 获取行值直到相同的条件出现在sql中的记录中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70213436/