所以我有点难过,我有一个像这样的表格设置
+-----------+------+
| Timestamp | Size |
+-----------+------+
| 1-1-13 + 10.3 +
+-----------+------+
| 1-3-13 + 6.7 +
+-----------+------+
| 1-5-13 + 3.0 +
+-----------+------+
| 1-9-13 + 11.4 +
+-----------+------+
我想知道是否有办法运行像这样的查询
SELECT * FROM table ORDER BY timestamp ASC LIMIT BY (SUM(size) <= 20.0);
这应该抓住前三行,因为前3行的大小总和为20.但是,它可能并不总是3行等于20.有时第一行的值可能为20,在这种情况下,它应该只抓住第一个。
我已经意识到这可以在运行查询后快速计算PHP中的总和,但我只想用MySQL完成这个。
答案 0 :(得分:6)
SELECT * FROM ints ORDER BY i;
+---+
| i |
+---+
| 0 |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
+---+
SELECT x.* ,SUM(y.i) FROM ints x JOIN ints y ON y.i <= x.i GROUP BY x.i;
+---+----------+
| i | SUM(y.i) |
+---+----------+
| 0 | 0 |
| 1 | 1 |
| 2 | 3 |
| 3 | 6 |
| 4 | 10 |
| 5 | 15 |
| 6 | 21 |
| 7 | 28 |
| 8 | 36 |
| 9 | 45 |
+---+----------+
SELECT x.* ,SUM(y.i) FROM ints x JOIN ints y ON y.i <= x.i GROUP BY x.i HAVING SUM(y.i) <= 20;
+---+----------+
| i | SUM(y.i) |
+---+----------+
| 0 | 0 |
| 1 | 1 |
| 2 | 3 |
| 3 | 6 |
| 4 | 10 |
| 5 | 15 |
+---+----------+
答案 1 :(得分:5)
您想要添加一个运行总计,并根据该限制,以下内容应该有效:
SET @runtot:=0;
SELECT
q1.t,
q1.s,
(@runtot := @runtot + q1.s) AS rt
FROM
(SELECT Date AS t,
SIZE AS s
FROM Table1
ORDER BY Date
) AS q1
WHERE @runtot + q1.s <= 20
编辑:此处演示 - SQL Fiddle
答案 2 :(得分:0)
使用窗口函数(在MySQL 8.0+和MariaDB 10.2 +中):
SELECT *
FROM (
SELECT t.*, SUM(size) OVER (
PARTITION by NULL
ORDER BY t.Timestamp
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) as csum
FROM MyTable t
ORDER BY t.Timestamp
) x
WHERE csum <= 20;
或更短:
SELECT *
FROM (
SELECT t.*, SUM(size) OVER (ORDER BY t.Timestamp) as csum
FROM MyTable t
ORDER BY t.Timestamp
) x
WHERE csum <= 20;