Sql 从差异最小的序列中选择项目
假设我们有一张这样的桌子:Sql 从差异最小的序列中选择项目,sql,sqlite,select,Sql,Sqlite,Select,假设我们有一张这样的桌子: id | num ---+---- 1 | 1 2 | 3 3 | 5 4 | 6 5 | 7 6 | 8 WITH RECURSIVE seq(t) as ( SELECT 1 UNION SELECT min(num) FROM table, seq WHERE num >= t + 3 AND num < 10 ) SELECT t FROM seq; 我需要做的是选择所有行,这样,当作为序列查看时,结
id | num
---+----
1 | 1
2 | 3
3 | 5
4 | 6
5 | 7
6 | 8
WITH RECURSIVE
seq(t) as (
SELECT 1
UNION
SELECT min(num) FROM table, seq WHERE num >= t + 3 AND num < 10
)
SELECT t FROM seq;
我需要做的是选择所有行,这样,当作为序列查看时,结果中的一行和下一行之间的最小差异至少为3。期望的结果应该是:
id | num
---+----
1 | 1
3 | 5
6 | 8
这在命令式语言中是微不足道的:
result = [table[0]]
for row in table:
if row['num'] >= result[-1]['num'] + 3:
result.append(row)
但我正在努力用纯SQL找到解决方案(顺便说一句,我正在使用SQLite)
我确实找到了一种类似这样的方法:
id | num
---+----
1 | 1
2 | 3
3 | 5
4 | 6
5 | 7
6 | 8
WITH RECURSIVE
seq(t) as (
SELECT 1
UNION
SELECT min(num) FROM table, seq WHERE num >= t + 3 AND num < 10
)
SELECT t FROM seq;
但是在这种情况下,LIMIT 1
应用于整个子查询,而不仅仅是第二个SELECT
,因此最后,seq
只有一行
这可以做到吗?你能解释一下当被视为一个序列时,两个邻居之间的最小距离至少是3的意思吗
什么是序列?什么是邻居?“序列”只是指行有一个顺序,它们按num
中增加的值排序。与相邻的
是相邻的两行,如第1行和第2行,或第5行和第6行。基本上,要得到结果,您需要取第一行并将其放入结果中。然后找到num
最低的行,其中num
至少比第一行大3。这是结果的第二行。等等。存在具有多种可能解决方案的序列(例如,1,4,5,8
)。该怎么办?对不起,我只是不明白那个顺序,不足以帮助你。祝你好运。@CL结果应该是1,4,8
,因为4-1>=3
。选择4
后,下一个有效数字必须至少为7,因此我们跳过5
并选择8
。您能否解释一下作为序列查看时,两个相邻位置之间的最小距离至少为3的意思?什么是邻居?“序列”只是指行有一个顺序,它们按num
中增加的值排序。与相邻的
是相邻的两行,如第1行和第2行,或第5行和第6行。基本上,要得到结果,您需要取第一行并将其放入结果中。然后找到num
最低的行,其中num
至少比第一行大3。这是结果的第二行。等等。存在具有多种可能解决方案的序列(例如,1,4,5,8
)。该怎么办?对不起,我只是不明白那个顺序,不足以帮助你。祝你好运。@CL结果应该是1,4,8
,因为4-1>=3
。选择4
后,下一个有效数字必须至少为7,因此我们跳过5
,选择8
。