2016-08-29 9 views
0

私はテーブルを重複排除するSQL文をスカルプトしようとしています。NULLSと最大値を使用した重複排除SQLステートメント比較値

テーブルには、ビジネスキーとして使用されるkey1、key2、key3という3つのキーがあります。 日付も使用されています。私は方法についての教育を受けておりません

WITH CTE AS(
    SELECT [key1], [key2], [key3], [date], 
     RN = ROW_NUMBER()OVER(PARTITION BY [key1], [key2], [key3], [date] ORDER BY [date] desc) 
    FROM dbo.Table1 
) 
DELETE FROM CTE WHERE RN > 1 

:私は基礎としてこのコードを使用してきた

If all rows have dates, retain only MAX(date) 
If one row has a date, and others are NULL, retain only row with date 
If all rows has date = NULL, keep all rows. 

のルールが(KEY1、KEY2、KEY3で試合を想定して)されていますSQL文にルールを適用します。どんな知恵があれば幸いです。

例deduplications:

CASE 1: before dedupication:    
key1 key2 key3 date 
1 A 1 null 
1 A 1 null 
1 A 1 null 

after deduplication:    
key1 key2 key3 date 
1 A 1 null 
1 A 1 null 
1 A 1 null 

CASE 2: before dedupication:    
key1 key2 key3 date 
1 A 1 1/1/2016 
1 A 1 1/1/2016 
1 A 1 1/1/2016 

after deduplication:    
key1 key2 key3 date 
1 A 1 1/1/2016 

CASE 3: before dedupication:    
key1 key2 key3 date 
1 A 1 1/1/2016 
1 A 1 1/2/2016 
1 A 1 1/3/2016 

after deduplication:    
key1 key2 key3 date 
1 A 1 1/3/2016 

CASE 4: before deduplication    
1 A 1 1/1/2016 
1 A 1 1/1/2016 
1 A 1 null 

after deduplication:    
key1 key2 key3 date 
1 A 1 1/1/2016 


CASE 5: before deduplication    
1 A 1 1/1/2016 
1 A 1 1/2/2016 
1 A 1 null 

after deduplication:    
key1 key2 key3 date 
1 A 1 1/2/2016 
+1

あなたの質問は私には明らかではありません。サンプルデータと何が起こりたいのですか? –

+0

@ arcee123の場合、条件が「いくつかの行に日付があり、他の行にNULLがある」場合は条件がカバーされません。 – Anton

+0

@Anton、ありがとう。そのシナリオ内のすべてのレコードが最大(日付)の行が優先されます。 – arcee123

答えて

0

あなたは、ほとんどがあったが、私は削除からルール#3を満たす行を除外するために、WHEREを必要とする、と考えています。

;WITH CTE AS(
     SELECT [key1], [key2], [key3], [date], 
      RN = ROW_NUMBER()OVER(PARTITION BY [key1], [key2], [key3] ORDER BY isnull([date], '19000101' desc) 
     FROM dbo.Table1 t1 
     WHERE EXISTS (SELECT * 
         FROM dbo.Table1 t2 
         WHERE t1.key1=t2.key1 
         and t1.key2=t2.key2 
         and t1.key3=t2.key3 
         and t1.[date] IS NOT NULL 
        ) 
    ) 
    DELETE FROM CTE WHERE RN > 1 
+0

ありがとうございました。これはどのようにしてケース1を満たしますか? – arcee123

+0

Sry、ビジネスキーのみでパーティションを分割し、回答を編集しました – dean

0
WITH CTE AS(
    SELECT [key1], [key2], [key3], [date], 
     RN = ROW_NUMBER() OVER (PARTITION BY [key1], [key2], [key3] ORDER BY [date] desc), 
     mxD = max([date]) OVER (PARTITION BY [key1], [key2], [key3]) 
    FROM dbo.Table1 
) 
DELETE FROM CTE WHERE RN > 1 and mxD is not null 
関連する問題