假设我有一个包含2列的sql表:第一列包含“主键”,第二列包含从0到100的“整数”。
问题1a:是否可以搜索3个或更多匹配给定值(例如3、29、88)的连续行
问题1b:是否有一种方法可以获取连续三个或更多记录之后的下一个值(记录)。
问题1c:如果数据库包含多于1个连续顺序的匹配项,则以“主键”的降序显示连续顺序的所有下一个值(记录)
我对SQL语句了解甚少,如果有人可以向我指出正确的方向或提供有关如何实现此目标的示例,我将不胜感激。
编辑20-9-2018
谢谢您抽出宝贵的时间回答我的问题。 @MikeT:您的示例仅超出了我对SQL的了解,但通过您逐步了解了一些命令,我了解了它的作用(我认为)。但这并不是我想要的,尽管对于我来说验证起来有点困难,因为每次运行都会随机创建这些值。
就像@ D-Shih一样,这是我要实现的目标的一个示例: Image example
答案 0 :(得分:0)
问题1a:是否可以搜索3个或更多连续的行 匹配给定值(例如3、29、88)
我相信下面显示了一个示例:-
DROP TABLE IF EXISTS xtable;
CREATE TABLE IF NOT EXISTS xtable (id INTEGER PRIMARY KEY, myint INTEGER);
WITH RECURSIVE cte1 AS (SELECT abs(random()) % 101
UNION ALL SELECT abs(random()) % 101 FROM cte1 LIMIT 500)
INSERT INTO xtable (myint) SELECT * FROM cte1;
-- RESULT 1
SELECT * FROM xtable ORDER BY myint;
-- RESULT 2
SELECT * FROM xtable WHERE myint IN (3,29,88,99,100,77,52,21) GROUP BY myint HAVING count(myint) >= 3 ORDER BY id;
请注意,这会在xtable中填充500行,其中 myint 列中的随机数从0到100,与第二列相同。因此,每次运行时结果都会有所不同。
3,29,88,99,100,77,52,21 是您的给定值列表(添加了额外数字以获得更多匹配)。
WHERE myint IN(....)
将选择的行仅限制为列表中的行。
GROUP BY myint
有效地为 myint 列中的每个唯一值创建1行,从而允许使用汇总功能,例如 count 。 SQL As Understood By SQLite - Aggregate Functions HAVING
是WHERE之后的一种,因此HAVING count(myint) >= 3
将输出的行限制为计数为3或更多的行。ORDER BY id
,可能需要也可能不需要,但可能适用于后续问题。上述结果可能是:-
问题1b:是否有办法获取下一个值(记录) 连续3个或更多记录之后。
如果您的意思是下一个值是下一个主键,那么如果主键是整数并且,则它是 rowid 的别名,并且没有删除,更新失败(创建临时表可以克服这些限制),则以下内容就足够了:-
WITH cte1 AS (SELECT *, max(id) AS maxid FROM xtable WHERE myint IN (3,29,88,99,100,77,52,21) GROUP BY myint HAVING count(myint) >= 3 ORDER BY id DESC)
SELECT * FROM xtable, cte1 WHERE maxid + 1 = xtable.id ORDER BY xtable.id;
;
例如,这将导致:-
基于(按:主键为359的行),根据:-
问题1c:如果数据库包含的匹配项超过1个, 连续订单显示连续订单的所有下一个值(记录) 按照“主键”的降序
这可能是您要的内容(基本上是上面的内容,但要包含> 1个连续数字,并由主键以降序排列)
WITH cte1 AS (SELECT *, max(id) AS maxid FROM xtable WHERE myint IN (3,29,88,99,100,77,52,21) GROUP BY myint HAVING count(myint) > 1 ORDER BY id DESC)
SELECT * FROM xtable, cte1 WHERE maxid + 1 = xtable.id ORDER BY xtable.id DESC;
;
虽然你可能是说:-
WITH cte1 AS (SELECT *, max(id) AS maxid FROM xtable WHERE myint IN (3,29,88,99,100,77,52,21) GROUP BY myint HAVING count(myint) > 1 ORDER BY id DESC)
SELECT * FROM xtable, cte1 WHERE maxid - 1 = xtable.id ORDER BY xtable.id DESC;
;