刪除重複我有一個表,如下所示: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)也會在最終輸出中做。
刪除重複我有一個表,如下所示: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)也會在最終輸出中做。
;
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
雖然這段代碼是受歡迎的,並且可能會提供一些幫助,但如果它包含一個解釋,它會[大大改進](// meta.stackexchange.com/q/114762)*它如何處理這個問題。沒有這些,你的答案就沒有什麼教育價值了 - 記住,你正在爲將來的讀者回答這個問題,而不僅僅是現在問的人!請編輯您的答案以添加解釋,並指出適用的限制和假設。 –
看來,要刪除重複的對任意兩個城市,無論在哪個這些城市出現的順序。什麼是不明確的是你想保留哪個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運行演示:
真正的通用答案是ANSI SQL兼容,它只允許GROUP BY子句中的列名稱。 (使用派生表!) – jarlh
我相信上面的查詢會在主要的RDBMS上運行,這可能是OP使用的。但是,感謝您告訴我瞭解「GROUP BY」的ANSI標準。 –
使用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
應該指出的是,通常'DISTINCT'是通過'GROUP BY'實現的(q.v.我在這裏給出的答案)。 –
@TimBiegeleisen,對某些產品可能是正確的,但不是全部。 (不太好的實現,我會說。) – jarlh
一個方法,跨數據庫和保證效果很好,在輸出的值只有在原來的表是使用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
。另外,如果可能不同,您可能需要考慮距離。
爲什麼要保留'E,F'而不是'F,E'?什麼是邏輯? –
@jarlh SELECT DISTINCT是我的第一個想法,但我注意到城市倒在「複製」,所以我認爲他需要的東西比那 – UberGrunk
我們可以保持F,E,順序無所謂,重要的是我們應該保持唯一對 – Jogesh