如果我们有一个表,其中有一列名为 X 包含 int。现在我想尽可能多地选择(实际上我想删除)X之和但不超过300的最旧的N行?
_id|X
1|50
2|150
3|80
4|100
5|200
6|70
其中 1 是最旧的,6 是最新的。所以我想得到第 1、2、3 行,其 X 的总和为 280。是否可以通过一个 select 语句来实现?
这应该这样做:
.mode columns
.headers on
CREATE TABLE foo (id INTEGER PRIMARY KEY AUTOINCREMENT, value INT);
INSERT INTO foo (value) VALUES (50), (150), (80), (100), (200), (70);
SELECT t1.id, t1.value
FROM foo t1 INNER JOIN foo t2 ON t2.id <= t1.id
GROUP BY t1.id, t1.value
HAVING SUM(t2.value) <= 300
ORDER BY t1.id;
SELECT
回报:
id value
---------- ----------
1 50
2 150
3 80
要删除选定的记录:
DELETE FROM foo WHERE id IN (
SELECT t1.id
FROM foo t1 INNER JOIN foo t2 ON t2.id <= t1.id
GROUP BY t1.id, t1.value
HAVING SUM(t2.value) <= 300);