2011-04-13 21 views
0

有沒有辦法做到在SQL這個任務:集團通過模糊標準

有行李的名稱表及其權重,看起來像這樣

 
luggage_id | luggage_name | luggage_weight 
------------+--------------+---------------- 
      1 | Tom   |    2 
      2 | Kat   |    3 
      3 | Lil   |    4 

的東西輸出中組,在重量差異,少於或完全是D單位。因此,如果d等於1,我們必須得到

 
1. Tom, Kat 
2. Kat, Lil 

,如果d等於2,我們必須得到

 
1. Tom, Kat, Lil 

,如果d是0.5,我們得到

 
1. Tom 
2. Kat 
3. Lil 

我試着使用交叉連接:

SELECT t1.luggage_name, t2.luggage_name 
FROM Luggages t1, Luggages t2 
WHERE ABS(t1.luggage_weight - t2.luggage_weight) <= 1 

導致

 

luggage_name | luggage_name 
--------------+-------------- 
Tom   | Tom 
Tom   | Kat 
Kat   | Tom 
Kat   | Kat 
Kat   | Lil 
Lil   | Kat 
Lil   | Lil 

難道可以用SQL來解決這個問題嗎?

EDIT 好了,是的,我們可以寫

SELECT t1.luggage_name, t2.luggage_name 
FROM Luggages t1, Luggages t2 
WHERE ABS(t1.luggage_weight - t2.luggage_weight) <= 1 
     AND t1.luggage_id < t2.luggage_id 

那麼我們將得到

 
luggage_name | luggage_name 
--------------+-------------- 
Tom   | Kat 
Kat   | Lil 

這意味着,湯姆與吉和吉組在組律。

但是,讓我們說我們有完全相同的權重

 

luggage_id | luggage_name | luggage_weight 
------------+--------------+---------------- 
      1 | Tom   |    1 
      2 | Kat   |    1 
      3 | Lil   |    1 

表然後我們就會

 

luggage_name | luggage_name 
--------------+-------------- 
Tom   | Kat 
Tom   | Lil 
Kat   | Lil 

這意味着,湯姆與吉和莉莉這是正確的,但下一組Kat與Lil已經在第一組。我想過這個問題,並不知道如何解決它。如何只輸出不同的組?

回答

3

您需要的條件限制完全笛卡爾座標到三角加入

SELECT t1.luggage_name, t2.luggage_name 
FROM Luggages t1, Luggages t2 
WHERE ABS(t1.luggage_weight - t2.luggage_weight) <= 1 

AND 
t1.luggageid < t2.luggageid 

這消除了不必要的對

編輯

你輸出將被

luggage_name | luggage_name 
--------------+-------------- 
Tom   | Kat 
Kat   | Lil 

d=0.5那麼你有沒有雙但因爲沒有差異小於0.5。單身人士名單實際上是錯誤當與d <= 1

相比輸出編輯2:證明你沒有得到它......

DECLARE @luggage TABLE (luggageid int IDENTITY(1,1), luggage_name varchar(30), luggage_weight float) 
INSERT @luggage (luggage_name, luggage_weight) VALUES ('Tom', 2), ('Kat', 3), ('Lil', 4) 

SELECT t1.luggage_name, t2.luggage_name 
FROM @luggage t1, @luggage t2 
WHERE ABS(t1.luggage_weight - t2.luggage_weight) <= 1 
AND 
t1.luggageid < t2.luggageid 


SELECT t1.luggage_name, t2.luggage_name 
FROM @luggage t1, @luggage t2 
WHERE ABS(t1.luggage_weight - t2.luggage_weight) <= 2 
AND 
t1.luggageid < t2.luggageid 


SELECT t1.luggage_name, t2.luggage_name 
FROM @luggage t1, @luggage t2 
WHERE ABS(t1.luggage_weight - t2.luggage_weight) <= 0.5 
AND 
t1.luggageid < t2.luggageid 
+0

這不會總是每組輸出一對嗎? – Oddthinking 2011-04-13 18:35:22

+0

@Oddthinking:不,請嘗試使用SQL進行更新。 – gbn 2011-04-13 18:42:34

+0

但還有一個問題是我在編輯中解釋的。 – alexanderkuk 2011-04-13 18:49:29

1
SELECT t1.luggage_name, MIN(t2.luggage_name) GroupsWith 
FROM Luggages t1 
JOIN Luggages t2 ON ABS(t1.luggage_weight - t2.luggage_weight) <= 1 
AND ((t1.luggage_weight < t2.luggage_weight) 
    OR (t1.luggage_weight = t2.luggage_weight AND t1.luggage_name < t2.luggage_name)) 
GROUP BY t1.luggage_name 
ORDER BY t1.luggage_name 

這將顯示用戶分組的鏈沒有任何重複,所以如果你有

Tom-2, Kat-3, Lil-4, Bob-5 

他們從對方d = 1。如果您的查詢有D = 1,則會顯示

Kat Lil 
Lil Bob 
Tom Kat 

其中顯示了整個組Tom-> Kat-> Lil-> Bob。

+0

有趣。這適用於所有具有相同權重但輸出(不是您的代碼)仍然感覺錯誤的地方 – gbn 2011-04-13 19:11:50