0

我的表有一个 NAME 和 DISTANCE 列。我想找出一种方法来列出所有在 N 个单位内或更少的相同名称的名称。即给定:

NAME    DISTANCE
a   2
a   4
a   3
a   7
a   1
b   3
b   1
b   2
b   5

(假设 N = 2)我想要

a 2 
a 4 
a 3
a 1
...
...

而不是 2 a 2 (因为它是双重计数)

我正在尝试应用此方法来解决一个 customerID 的索赔日期(存储为数字),这些日期出现在彼此周围的集群中。我希望能够在同一客户提出另一次索赔后的 10 天内标记 customerID 和索赔日期。即,|a.claimdate - b.claimdate| <= 10. 当我使用这个方法时

WHERE a.CUSTID = b.CUSTID
AND a.CLDATE BETWEEN (b.CLDATE - 10 AND b.CLDATE + 10)
AND a.CLAIMID <> b.CLAIMID

我双数。CLAIMID 是独一无二的。

4

2 回答 2

2

由于您不需要文本,只需要值,因此您可以使用以下方法完成DISTINCT

select distinct t.name, t.distance
from yourtable t
  join yourtable t2 on t.name = t2.name 
    and (t.distance = t2.distance+1 or t.distance = t2.distance-1)
order by t.name

SQL 小提琴演示

鉴于您的编辑,如果您正在寻找一定距离之间的结果,您可以使用 >= 和 <= (或 BETWEEN):

select distinct t.name, t.distance
from yourtable t
  join yourtable t2 on t.name = t2.name 
    and t.distance >= t2.distance-1 
    and t.distance <= t2.distance+1
    and t.distance <> t2.distance
order by t.name

您需要添加最终标准,t.distance <> t2.distance这样您就不会返回整个数据集——从技术上讲,每个距离都在其自身之间。如果您有一个要添加到联接的主键,这会更好,但如果您没有,您也可以利用ROW_NUMBER()它来获得相同的结果。

with cte as (
  select name, distance, row_number() over (partition by name order by (select null)) rn
  from yourtable
  )
select distinct t.name, t.distance
from cte t
  join cte t2 on t.name = t2.name 
    and t.distance >= t2.distance-1
    and t.distance <= t2.distance+1
    and t.rn <> t2.rn
order by t.name

更新的 SQL Fiddle

于 2013-05-09T19:39:49.060 回答
1

我喜欢@sgeddes解决方案,但您也可以像这样摆脱独特的和or在连接条件下:

select * from table a
where exists (
    select 1 from table b
    where b.name = a.name
        and b.distance between a.distance - 1 and a.distance + 1
)

这也确保了包含相等距离的行并考虑整个范围,而不仅仅是@HABOn建议的距离差为 的行。

于 2013-05-09T19:46:26.747 回答