2009-08-24 13 views
2

フォローを達成するためのステートメントの作成方法?SQL Serverテーブルの2つの列に基づいて、最小値を除くすべてを削除します

テーブルには、次のデータ

col1 10000_10000_10001_10002_10002_10002 
col2 10____20____10____30____40_____50 

と2列(両方ともNVARCHARある)を持っている私は、次のデータを保持したいと言うことができます:ので、ベースの重複を削除

col1 10000_10001_10002 
col2 10____10____30 

(列のいずれも主キーではない)、2番目の列に最小値を持つレコードのみを保持します。

これを行う方法は?

答えて

0

申し訳ありませんが、私は質問を誤解しました。仮定して動作するはずです


DELETE FROM test 
WHERE col1 + '|' + col2 NOT IN 
(SELECT col1 + '|' + MIN(col2) 
FROM test 
GROUP BY col1) 

:もちろん


SELECT col1, MIN(col2) as col2 
FROM table 
GROUP BY col1 

が問題の行を返しますが、あなたは一意の識別子を追加するために、テーブルを変更することはできませんと仮定すると、あなたのような何かをする必要がありますパイプ文字は決してあなたのセットに現れません。

+0

本当に質問には答えません。 OPは、行を削除することについて尋ね、それらを選択しないでください –

+0

右。私の脳はまだ歯がありません。私は修正がうまくいくと思う。 –

0

理想的には、あなたが言うことができるようにしたい:

DELETE 
FROM tbl 
WHERE (col1, col2) NOT IN (SELECT col1, MIN(col2) AS col2 FROM tbl GROUP BY col1) 

残念ながら、それはT-SQLで許可されていないが、(明確にするためEXCEPT使用して)から、ダブルでの独自拡張があります:一般的に

DELETE 
FROM tbl 
FROM tbl 
EXCEPT 
    SELECT col1, MIN(col2) AS col2 FROM tbl GROUP BY col1 

DELETE 
FROM tbl 
WHERE col1 + '|' + col2 NOT IN (SELECT col1 + '|' + MIN(col2) FROM tbl GROUP BY col1) 

またはその他の回避策。

4

これはあなたのために働く必要があります。

; 
WITH NotMin AS 
(
    SELECT Col1, Col2, MIN(Col2) OVER(Partition BY Col1) AS TheMin 
    FROM Table1 
) 

DELETE Table1 
--SELECT * 
FROM Table1 
INNER JOIN NotMin 
ON Table1.Col1 = NotMin.Col1 AND Table1.Col2 = NotMin.Col2 
    AND Table1.Col2 != TheMin 

をこれが(派生テーブルのような、しかしクリーナー)CTEと少ないコードのショートカットとしてOVER句を使用しています。私もあなたが一致する行(削除する前に確認)を見ることができるようにコメント付きの選択を追加しました。これはSQL 2005/2008で動作します。

ありがとう、 Eric

+0

大きな結果セットを使用する場合、これはパフォーマンス上最適ではない可能性があります。そのような場合は、より良い答えに取り組むことができます。 – Anon246

+0

私はこの種のものに個人的にrow_number()またはrank()を使用するのが好きです...しかしそれはまだよく受け入れられるべきです。 –

+0

良い点。私はその点であなたのソリューションを見ることに興味があります。私は常にover節の斬新な使い方を見たいと思う。 :-) – Anon246

関連する問題