2015-06-19 94 views
0

刪除具有相同ID值的重複行時,如何刪除特定列中具有空值的行。如何刪除重複的ID行。刪除時,請使用另一列中具有空值的行。

注意:還有其他非重複行(如下例如12)具有NULL值,並且仍應在結果集中被選中。

輸入表:

Id | sale_date | price 
----------------------------- 
11 20051020  22.1 
11 NULL   20.1 
12 NULL   20.1 
13 20051020  20.1 

預期結果:

Id | sale_date | price 
----------------------------- 
11 20051020 22.1  
12 NULL  20.1  
13 20051020 20.1  
+0

如果您具有重複的「Id」值,但具有不爲空的「sale_date」值,會發生什麼情況。在這種情況下你期望得到什麼? – sstan

+0

我寧願用最新的日期。 – Dan

回答

3

假設你有SQL Server 2008或以上,這會爲你工作。我使用row_number並從最大日期開始按ID分配值。因此,大於1的任何值大於最高日爲特定的ID下層,所以我刪除ROW_NUM大於1

檢查出來:

DECLARE @yourTable TABLE (ID INT,Sale_date DATE, Price FLOAT); 

INSERT INTO @yourTable 
VALUES (11,'20051020',22.1), 
     (11,NULL,20.1), 
     (12,NULL,20.1), 
     (13,'20051020',20.1); 

WITH CTE 
AS 
(
    SELECT *, 
      ROW_NUMBER() OVER (PARTITION BY ID ORDER BY sale_date DESC) AS row_num 
    FROM @yourTable 
) 

DELETE 
FROM CTE 
WHERE row_num > 1 

SELECT * 
FROM @yourTable 
0

試試這個

SELECT * FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Sale_Date desc) AS ROW_NUM FROM AA1) A 
WHERE ROW_NUM<2 
0

如果您有重複的ID,而不是每個SALE_DATE是NULL,您可以保留最新日期,並刪除其他日期:

DELETE @MyTable 
FROM @MyTable AS T1 
INNER JOIN (SELECT Id, MAX(sale_date) AS sale_date FROM @MyTable GROUP BY Id HAVING COUNT(*) > 1) 
    AS T2 ON T1.ID = T2.ID AND (T1.sale_date is null OR T1.sale_date < T2.sale_date)