2016-08-29 3 views
0

Ich versuche, eine SQL-Anweisung zu formen, um eine Tabelle zu deduplizieren.Design Deduplizierung SQL-Anweisung mit NULLS vs MAXWERT

Die Tabelle enthält drei Schlüssel: Schlüssel1, Schlüssel2, Schlüssel3, der als Geschäftsschlüssel verwendet wird. Ein Datum wird ebenfalls verwendet.

Die Regeln werden (vorausgesetzt, Streichhölzer in Tasten 1, 2, key3):

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. 

Ich habe als Grundlage diesen Code unter Verwendung von:

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 

ich erzogen bin nicht, wie man Wenden Sie die Regeln für die SQL-Anweisung an. Jede Weisheit würde sehr geschätzt werden.

Beispiel 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

Ihre Frage ist mir nicht klar. Können Sie Beispieldaten einschließen und was Sie wollen? –

+0

@ arcee123, Ihre Bedingungen decken nicht "Wenn ein paar Zeilen ein Datum haben und andere Zeilen NULL haben". – Anton

+0

@Anton, danke. die Zeile mit dem Maximum (Datum) hat Vorrang vor allen Datensätzen in diesem Szenario. – arcee123

Antwort

0

Sie fast da waren, glaube ich, brauchen nur eine WHERE Reihen # erfüllt Regel 3 von Löschung auszuschließen.

;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

Vielen Dank. Wie erfüllt das CASE 1? – arcee123

+0

Sry, Partition nur nach Business Key, bearbeitet die Antwort – 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