我有一个包含三列的表:id、name和value。我想选择所有具有不同值的行,并且没有其他行具有例如3范围内的值。因此,如果行中的值为:
id
name
value
3
14, 15, 15, 17, 20, 23, 23, 23, 24, 29, 33, 32, 32, 33, 38, 38, 43
然后,我想返回值为20、29和43的行。
20
29
43
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中的43和t2中的20将给予-9,当然是< 3,因此它将错误地从结果中删除43。检查不同的id也很重要,因为否则,它将在某个点将20与t1进行比较,并将20与t2进行比较,这给出了0的差,因此,它也将被错误地从结果中删除。参见this fiddle
table
abs(...)
t1
t2
-9
< 3
0
voj3qocg2#
对于SQLite 3.28.0+,您可以使用COUNT()窗口函数,并根据您的条件调整RANGE帧类型:
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。
2条答案
按热度按时间92vpleto1#
假设您的表具有以下结构
| 身份证|价值|……|
| --------------|--------------|--------------|
| 1|十四岁|……|
| 二|十五岁|……|
| ……|……|……|
您可以执行以下操作
即从
table
中选择所有行,其中没有其他行(即具有不同的id
),其中value
的差异小于3
。您需要
abs(...)
,因为否则比较例如t1
中的43
和t2
中的20
将给予-9
,当然是< 3
,因此它将错误地从结果中删除43
。检查不同的id
也很重要,因为否则,它将在某个点将20
与t1
进行比较,并将20
与t2
进行比较,这给出了0
的差,因此,它也将被错误地从结果中删除。参见this fiddle
voj3qocg2#
对于SQLite 3.28.0+,您可以使用
COUNT()
窗口函数,并根据您的条件调整RANGE
帧类型:参见demo。