2017-05-03 23 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 

あなたはplsは私はこのためのSQLを記述助けることができますか?

都市の順序は関係ありません。ユニークな組み合わせは1つだけ必要です。 ここ(F、E、800)も最終出力で行います。

+0

なぜ 'F、E'ではなく' E、F'を保つのですか?論理は何ですか? –

+0

@jarlh SELECT DISTINCTも私の最初の考えでしたが、都市は "duplicate"で反転されていることに気付いたので、彼はそれ以上のものが必要だと思っています – 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です。あなたが使用しているSQLのバージョンを語ってくれたことがないので、私は、できるだけ一般的な答えを与えた

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 

注:あなたが最大の距離を保持してOKですと仮定すると、次のクエリを試すことができます。このクエリは、MySQL、Postgresなどいくつかの方法でいくらか簡略化することができます。

Rextester

+0

真の一般的な答えは、ANSI SQLに準拠しているため、GROUP BY句には列名だけを使用できます。 (派生テーブルを使用してください!) – jarlh

+0

上記のクエリは、おそらくOPが使用している大規模なRDBMSで実行されると思います。しかし、手紙のおかげで私は 'GROUP BY'のANSI標準を知っています。 –

0

使用case式は常に2列目の最初の列の最初の都市、そして最後の街を置くために:ここで

は、MySQLで実行されているデモです。その後、重複行を削除する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 allではなくunionを使用する必要があります。また、異なる場合は、距離を考慮する必要があるかもしれません。

関連する問題