在SQLite中有没有一种方法可以选择带边距的不同整数?

nnsrf1az  于 2023-04-06  发布在  SQLite
关注(0)|答案(2)|浏览(189)

我有一个包含三列的表:idnamevalue。我想选择所有具有不同值的行,并且没有其他行具有例如3范围内的值。因此,如果行中的值为:

14, 15, 15, 17, 20, 23, 23, 23, 24, 29, 33, 32, 32, 33, 38, 38, 43

然后,我想返回值为202943的行。

92vpleto

92vpleto1#

假设您的表具有以下结构
| 身份证|价值|……|
| --------------|--------------|--------------|
| 1|十四岁|……|
| 二|十五岁|……|
| ……|……|……|
您可以执行以下操作

select id, value, ...
from thetable t1
where not exists (
  select t2.value 
  from thetable t2 
  where abs(t2.value - t1.value) < 3 
        and t1.id <> t2.id)

即从table中选择所有行,其中没有其他行(即具有不同的id),其中value的差异小于3
您需要abs(...),因为否则比较例如t1中的43t2中的20将给予-9,当然是< 3,因此它将错误地从结果中删除43。检查不同的id也很重要,因为否则,它将在某个点将20t1进行比较,并将20t2进行比较,这给出了0的差,因此,它也将被错误地从结果中删除。
参见this fiddle

voj3qocg

voj3qocg2#

对于SQLite 3.28.0+,您可以使用COUNT()窗口函数,并根据您的条件调整RANGE帧类型:

WITH cte AS (
  SELECT *, 
         COUNT(*) OVER (
           ORDER BY value
           RANGE BETWEEN 2 PRECEDING AND 2 FOLLOWING
         ) AS cnt
  FROM tablename
)
SELECT id, name, value FROM cte WHERE cnt = 1;

参见demo

相关问题