2017-03-01 6 views
3

Ich habe ein seltsames Szenario zu entfernen und konnte keine Lösung in Google oder eine Frage ähnlich in Stapelüberlauf finden:SQL Server: Wie teilweise leere Zeilen aus der Tabelle

Hier ist meine Tabelle:

table1 (zur Zeit)

category col2 col3 col4 col5 col6 col7 col8 totalsum 
-------------------------------------------------------------- 
a   12 25 null null null null null $20 
a   12 25 34 null null null null $20 
b   57 93 72 63  99 null null $50 
b   57 93 72 63  99 107 null $50 
b   57 93 72 63  99 107 32  $50 

ich brauche die teilweise/fangenen Zeilen und speichern Sie die komplettere Reihe in eine neue Tabelle zu entfernen, so dass meine Tabelle nun das sein wird (ich die Zeilen mit der geringsten Anzahl von Nullen halten müssen) aber ich habe Probleme, die unvollständigen Zeilen herauszufiltern und die mehr zu isolieren vollständige Zeilen

, was ich brauche

category col2 col3 col4 col5 col6 col7 col8 totalsum 
-------------------------------------------------------------- 
a   12 25 34 null null null null $20 
b   57 93 72 63  99 107 32  $50 

jemand irgendwelche Ideen Hat?

Danke

+0

Ist die neueste Zeile für jede Kategorie immer mehr Details haben als frühere Reihe von gleiche Kategorie? –

+0

Nein, das ist keine Voraussetzung –

Antwort

0

Sie können versuchen, durch diese Spalten zusammen mit einem row_number zu sortieren():

select * 
from (
select * 
, ROW_NUMBER() OVER (PARTITION BY category ORDER BY col2 desc, col3 desc, col4 desc, col5 desc, col6 desc, col7 desc, col8 desc) rn 
from table1) i 
where i.rn = 1 

Testcode:

;WITH cte AS 
(
SELECT 'a' category ,12 col2 ,25 col3, null col4, null col5, null col6 ,null col7, null col8, 20 totalsum 
UNION ALL SELECT 'a' ,12 ,25 ,34 ,null ,null ,null ,null ,20 
UNION ALL SELECT 'b' ,57 ,93 ,72 ,63 ,99 ,null ,null ,50 
UNION ALL SELECT 'b' ,57 ,93 ,72 ,63 ,99 ,107 ,null ,50 
UNION ALL SELECT 'b' ,57 ,93 ,72 ,63 ,99 ,107 ,32 ,50 
) 
SELECT * 
FROM (
SELECT * 
, ROW_NUMBER() OVER (PARTITION BY category ORDER BY col2 DESC, col3 DESC, col4 DESC, col5 DESC, col6 DESC, col7 DESC, col8 DESC) rn 
FROM cte) i 
WHERE i.rn = 1 
+0

das hat perfekt funktioniert! Danke –

1

Verwenden GROUP BY:

SELECT category, 
     MAX(col2) AS col2, 
     MAX(col3) AS col3, 
     MAX(col4) AS col4, 
     MAX(col5) AS col5, 
     MAX(col6) AS col6, 
     MAX(col7) AS col7, 
     MAX(col8) AS col8, 
     MAX(totalsum) AS totalsum 
FROM yourTable 
GROUP BY category 

Dieser Ansatz funktioniert gut würden Sie akzeptieren den größten nicht NULL Wert pro Spalte OK sind unter der Annahme, pro Kategorie. Dieser Pivot-Trick funktioniert, weil die MAX()-Funktion in SQL Server NULL Werte ignoriert.

+0

Was ist, wenn die letzte Zeile der Kategorie den Spaltenwert geändert hat, der kleiner ist als die vorherige Zeile derselben Kategorie? –

+0

@chindiralasampathkumar Dann würde dieser einfache Ansatz fehlschlagen. Aber deuteten die OP-Daten darauf hin, dass dies der Fall sein würde? –

0

Kann etwas wie dies:

select * from table1 as t1 
where not exists(
       select 1 from table1 as t2 
       where(t1.id!=t2.id)and(t1.category=t2.category) 
       and((t1.col1=t2.col1)or(is_null(t1.col1)and(not is_null(t2.col1))and... 
       ) 

Aber für Sie gleiche Zeilen aus T1 und T2 jeder Zeile ausschließen müssen eindeutige ID haben, siehe (t1.id = t2.id!). Grundidee - Zeilen auszuschließen, die mehr relevante Kopie (mehr NOT Nullfelder) hat.

Verwandte Themen