2017-03-01 69 views
3

刪除部分空行我有一個奇怪的情景,但沒有找到在谷歌或解決方案堆棧溢出類似的問題:的SQL Server:如何從表

這裏是我的表:

表1(目前)

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 

我需要刪除的部分/不完整的行和更完整的行保存到一個新的表,這樣我的表,現在將是(我需要保持的行與空值數最少)但我無法濾除不完整的行並隔離更多完整的行。

我需要什麼

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 

有沒有人有什麼想法?

謝謝

+0

是對每個類別的最新行總是比前一行詳細資料同一類別? –

+0

不,這不是要求 –

回答

0

您可以嘗試通過那些列用ROW_NUMBER()一起進行排序:

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 

測試代碼:

;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

這工作完美!謝謝 –

1

使用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 

這種方法將工作做好假設你有接受每列最大的非NULL值,按類別確定。這個重要技巧是可行的,因爲SQL Server中的MAX()函數忽略了NULL值。

+0

如果最新一行類別的列值小於同一類別的前一行,那該怎麼辦? –

+0

@chindiralasampathkumar然後這個簡單的方法會失敗。但是,OP的數據是否暗示了這種情況? –

0

可能是一些因爲這樣:

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... 
       ) 

但是,你可以從T1和T2的每一行排除相同的行必須有唯一的ID,請參閱(t1.id = t2.id!)。 主要思想 - 排除具有更多相關副本的行(更多非空字段)。