2017-05-03 88 views
0

刪除重複我有一個表,如下所示:SQL查詢,跨行

City1 City2 Distance 
A  B  500 
C  D  400 
E  F  800 
F  E  800 

我的輸出應該如下:

City1 City2 Distance 
A  B  500 
C  D  400 
E  F  800 

你能請幫我寫了這一個sql?

城市的順序並不重要。只需要一個獨特的組合。 這裏(F,E,800)也會在最終輸出中做。

+0

爲什麼要保留'E,F'而不是'F,E'?什麼是邏輯? –

+0

@jarlh SELECT DISTINCT是我的第一個想法,但我注意到城市倒在「複製」,所以我認爲他需要的東西比那 – UberGrunk

+0

我們可以保持F,E,順序無所謂,重要的是我們應該保持唯一對 – Jogesh

回答

0

; 

WITH cte 
AS (
SELECT ROW_NUMBER() OVER (
     PARTITION BY /* based on what? can be multiple columns*/ 
     ORDER BY (
       SELECT 0 
       ) 
     ) RN 
FROM yourtable 
) 
DELETE 
FROM cte 
WHERE RN > 1 
+0

雖然這段代碼是受歡迎的,並且可能會提供一些幫助,但如果它包含一個解釋,它會[大大改進](// meta.stackexchange.com/q/114762)*它如何處理這個問題。沒有這些,你的答案就沒有什麼教育價值了 - 記住,你正在爲將來的讀者回答這個問題,而不僅僅是現在問的人!請編輯您的答案以添加解釋,並指出適用的限制和假設。 –

1

看來,要刪除重複的對任意兩個城市,無論在哪個這些城市出現的順序。什麼是不明確的是你想保留哪個Distance價值。假設你是保留最大距離OK,你可以試試下面的查詢:

SELECT 
    CASE WHEN City1 < City2 THEN City1 ELSE City2 END AS City1, 
    CASE WHEN City2 < City1 THEN City1 ELSE City2 END AS City2, 
    MAX(Distance) AS Distance 
FROM yourTable 
GROUP BY 
    CASE WHEN City1 < City2 THEN City1 ELSE City2 END, 
    CASE WHEN City2 < City1 THEN City2 ELSE City1 END 

注意,我給作爲通用的答案有可能,因爲你從來沒有告訴我們您正在使用哪個版本的SQL。這個查詢可以在MySQL,Postgres和其他一些中簡化。

這裏是在MySQL運行演示:

Rextester

+0

真正的通用答案是ANSI SQL兼容,它只允許GROUP BY子句中的列名稱。 (使用派生表!) – jarlh

+0

我相信上面的查詢會在主要的RDBMS上運行,這可能是OP使用的。但是,感謝您告訴我瞭解「GROUP BY」的ANSI標準。 –

0

使用case表達式始終把第一列第一城,和最後一個城市在第二列。然後做SELECT DISTINCT去除重複行:

select distinct case when City1 < City2 then City1 else City2 end, 
       case when City1 > City2 then City1 else City2 end, 
       distance 
from tablename 
+0

應該指出的是,通常'DISTINCT'是通過'GROUP BY'實現的(q.v.我在這裏給出的答案)。 –

+0

@TimBiegeleisen,對某些產品可能是正確的,但不是全部。 (不太好的實現,我會說。) – jarlh

0

一個方法,跨數據庫保證效果很好,在輸出的值只有在原來的表是使用union all

select t.* 
from t 
where city1 < city2 
union all 
select t.* 
from t 
where city1 > city2 and 
     not exists (select 1 
        from t t2 
        where t2.city1 = t1.city2 and t2.city2 = t1.city1 
       ); 

請注意,如果表中有重複項,則應使用union而不是union all。另外,如果可能不同,您可能需要考慮距離。