2013-05-09 63 views
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(因爲雙數)

我想應用此方法來解決具有索賠日期(以數字形式存儲)的客戶ID,這些索賠日期以彼此簇集的形式出現。我希望能夠標記客戶ID以及同一客戶發出的另一個索賠要求的10天內的索賠日期。即| 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是獨一無二的。

+0

你使用的是mysql嗎?或SQL服務器? – 2013-05-09 19:28:56

+0

使用microsoftSQL,但mysql語法將是偉大的 – 2013-05-09 19:31:23

回答

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 Fiddle Demo

鑑於您的編輯,如果你正在尋找之間的結果有一定的距離,你可以使用> =和< =(或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 

您需要添加01最終標準所以你不返回整個數據集 - 技術上每個距離都在它自己之間。如果你有一個主鍵添加到連接中,這會更好,但如果你不這樣做,你也可以利用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 

Updated SQL Fiddle

+0

不知道這是否在性能上有很大的不同,但我會用(t2.distance + 1,t2.distance - 1)中的'和t.distance替換'或' ',主要是爲了可讀性。 – dang 2013-05-09 19:42:32

+1

我認爲這個問題意味着距離'N'可以作爲輸入提供。如果是這種情況,那麼距離就需要變化,而不是「IN」。 – HABO 2013-05-09 19:46:11

+0

好點,[@HABO](http://stackoverflow.com/users/92546/habo)。在[我自己的回答]中考慮了這一點(http://stackoverflow.com/a/16469879/1815558)。 – dang 2013-05-09 19:48:16

1

我喜歡@sgeddessolution,但你也可以在連接狀態下襬脫了獨特和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 
) 

這也保證了平等的行距離包括在內,並考慮整個範圍,而不僅僅是距離差值恰好爲n的行,如@HABO所示。

+1

我喜歡你要去的地方,但是你也需要添加標準來檢查自己。這就是我的意思(http://sqlfiddle.com/#!3/4c89f/2)。這會返回不正確的結果。你可以通過引入ROW_NUMBER()來解決這個問題。或者從技術上講,您可以添加和a.distance <> b.distance,但對於具有相同距離的不同行,這不是一個好的解決方案。不錯的用法雖然存在 - +1 – sgeddes 2013-05-09 20:57:15

+0

很難區分沒有PK或唯一列的行。我想你可以用一個標識列創建一個表變量或臨時表,然後比較它們,包括子查詢中的'和a.id <> b.id'。 – dang 2013-05-09 21:37:56