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