SQLite:LIMIT个值取决于条件

时间:2019-05-09 08:37:12

标签: sql sqlite

给出下表:

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。

4 个答案:

答案 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;