2016-06-15 5 views
1

私は一意のキーを持つはずのテーブルを持っています。私は他のキー(Col1)の一意性に基づいて1つのキー(Col2)を生成します。今、何かが起こった、私はCol2でユニークなキーがありますが、いくつかのデータがCol1で繰り返されます。 instanseのために、私たちはCol2で重複するCol1を持つ行を削除し、Col2で最大の値を持つ行を削除することを考慮します。

enter image description here

を持っていると私は自動的DB02の値を持つ行を削除したい、とDB01が残ります。 02は01より大きく、最低値を保持したいので(文字が含まれているにもかかわらず)。

質問に手伝ってください。

私が試したクエリの写真と、私が得られなかった結果があります。 :(

enter image description here

答えて

1

答えはGiorgos Betsosが示唆されたものに似ていますが、コードは次のようにする必要があります:

WITH ToDelete AS (
    SELECT Col2 ,ROW_NUMBER() OVER (PARTITION BY Col1 ORDER BY Col1) AS rn 
    FROM mytable 
) 
DELETE FROM ToDelete 
WHERE rn > 1 
2

あなたはDELETEを実行するためにCTEを使用することができます。

;WITH ToDelete AS (
    SELECT ROW_NUMBER() OVER (PARTITION BY Col2 ORDER BY Col1) AS rn 
    FROM mytable 
) 
DELETE FROM ToDelete 
WHERE rn > 1 

ROW_NUMBERウィンドウ関数は、各Col2パーティション内のレコードを列挙するために使用されている最低Col1値を持つレコードがあります。 rn = 1の値が割り当てられ、その他のレコードはすべてrn > 1となり、削除されます。

+0

おかげで、あなたはコードを少し喜ばことができます。それは最初の価値を維持するだろうか? –

+0

この行:OVER SELECT ROW_NUMBER()(BYのCol1 Col2にはORDER BY PARTITION)ASすべての値が1であるテーブルMYTABLE リターンFROM RN、それはそれらのすべてを返します。 何かが間違っていると思います。 –

+0

@yousefyeganeいいえ、私は 'rn'の値がどんなものかを説明しました。 –

関連する問題