【发布时间】:2019-11-07 09:18:29
【问题描述】:
我有一张像这样的表
id remaining expiry_date
1 200 2019-11-15
2 10 2019-11-23
3 10 2019-11-16
4 10 2019-11-16
5 7 2019-11-16
我想获取运行总数为 215 且按 expiry_date 排序的 ascending 顺序的结果。
到目前为止我能做到什么?
SELECT *, @sum := (@sum + remaining) AS csum
FROM tickets
JOIN (SELECT @sum := 0) r
WHERE @sum < 215
ORDER BY id;
此查询返回以下正确的结果。
id remaining expiry_date csum
1 200 2019-11-15 200
2 10 2019-11-23 210
3 10 2019-11-16 220
但是当我尝试使用expiry_date 对其进行排序时,它会返回所有记录。
SELECT *, @sum := (@sum + remaining) AS csum
FROM tickets
JOIN (SELECT @sum := 0) r
WHERE @sum < 215
ORDER BY expiry_date;
结果:
id remaining expiry_date csum
1 200 2019-11-15 200
3 10 2019-11-16 210
4 10 2019-11-16 220
5 7 2019-11-16 227
2 10 2019-11-23 237
排序是正确的,但结果比我需要的要多。
我想要什么
我想返回以下结果。
id remaining expiry_date csum
1 200 2019-11-15 200
3 10 2019-11-16 210
4 10 2019-11-16 220
此外,数字 215 可以动态变化,因此返回的行数可以根据该数字而变化。如何更改查询以便实现此目的?
编辑
对于我不清楚我在结果集中真正想要的内容,我深表歉意。请让我对此编辑进行澄清。我不希望运行总计小于给定数量的记录。我想要记录,直到运行总计等于或超过给定数量。
【问题讨论】:
-
您似乎想要“小于或等于 215 的(最高或全部)运行总数” - 除了 220 大于 215 !?!?!
-
@Strawberry 我想要总和的记录,直到它通过总和 215,因此总和为 220 的记录。
-
我对 MySQL 中的变量没有经验。我想
ORDER BY不知何故迟到了。不知道。你的 MySQL 版本是多少?从 MySQL 8 开始,您将像在其他现代 DBMS 中一样使用窗口函数,而不是使用变量。 -
那为什么不这么说!?!?
标签: mysql sql cumulative-sum