2015-06-19 92 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)