给出下表:
ID A B
-----------
1 6 5
2 3 2
3 5 1
4 5 5
5 9 8
6 1 7
我需要SELECT
满足条件(A-B)> 0的前X行
因此它不能是:
SELECT ID FROM TABLE WHERE (A - B) > 0
否则,我将获得ID为5的行,而我想在第3行上停止。
是否可以在LIMIT语句中写入条件? 像这样:
SELECT ID FROM TABLE LIMIT (A - B) > 0
我该怎么办?有其他选择吗?
注意:当我写“前X行”时,是指ID的升序。
更新: 对不起,我没有正确解释自己。 我不知道X值。 我说X是未知变量,具体取决于表。 我改一下要求:
我需要选择所有行(从ID 1开始)直到条件(A) -B)>不满足0。
答案 0 :(得分:1)
您可以尝试以下方法:
SELECT ID FROM TABLE WHERE ID < (SELECT MIN(ID) FROM TABLE WHERE (A - B) <= 0) ORDER BY ID
答案 1 :(得分:1)
如果没有匹配结束条件的行,则需要小心。
这是一种始终有效的方法:
SELECT t.ID
FROM test t CROSS JOIN
(SELECT MIN(id) as min_id
FROM test
WHERE A <= B
) tt
WHERE t.id < tt.min_id OR tt.min_id IS NULL;
Here是db <>小提琴。 (碰巧使用MySQL;这是因为在SQLite中创建表似乎没有用。)
答案 2 :(得分:0)
您非常亲密。这是SQL Fiddle
SELECT * FROM Table WHERE (A - B) > 0 LIMIT 3
答案 3 :(得分:0)
这听起来像是一个基本的间隙和孤岛问题,您只想找到第一个孤岛。使用sqlite 3.25中添加的window函数可以轻松解决此类问题(因此,此答案不适用于旧版本)。
给出此表:
CREATE TABLE test(id INTEGER PRIMARY KEY, a INTEGER, b INTEGER);
INSERT INTO test VALUES(1,6,5);
INSERT INTO test VALUES(2,3,2);
INSERT INTO test VALUES(3,5,1);
INSERT INTO test VALUES(4,5,5);
INSERT INTO test VALUES(5,9,8);
INSERT INTO test VALUES(6,1,7);
此查询:
WITH islands AS
(SELECT id, a, b
, row_number() OVER (PARTITION BY a - b > 0 ORDER BY id) AS isle_rn
FROM test)
SELECT id, a, b
FROM islands
WHERE id = isle_rn AND a - b > 0
ORDER BY id;
产生
id a b
---------- ---------- ----------
1 6 5
2 3 2
3 5 1
基本上,它将表分为两个分区-a - b > 0
为true的分区和为false的分区。每个分区按id
排序,然后为每一行编号。最后,仅返回该数字等于id
的行-条件为false的第一行将导致所有以后的所有true的行具有不同的id和行号。额外的a - b > 0
校验是为了解决id 1为false且不应返回任何行的情况。
这确实假设id
始终从1开始并且没有空格。如果不是这种情况,则此变体会添加一个已使用的顺序行号,而不是id
:
WITH islands AS
(SELECT id, a, b
, row_number() OVER (ORDER BY id) AS rn
, row_number() OVER (PARTITION BY a - b > 0 ORDER BY id) AS isle_rn
FROM test)
SELECT id, a, b
FROM islands
WHERE isle_rn = rn AND a - b > 0
ORDER BY id;