【问题标题】:How to remove duplicate ID rows. While removing, use the rows that has NULL value in another column如何删除重复的 ID 行。删除时,使用另一列中具有 NULL 值的行
【发布时间】:2015-06-19 20:15:27
【问题描述】:

在删除具有相同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    

【问题讨论】:

  • 如果您有重复的Id 值,但有不同的sale_date 值不为空,会发生什么情况。在这种情况下你期望得到什么?
  • 我更喜欢日期最晚的那个。

标签: sql sql-server tsql


【解决方案1】:

假设您拥有 SQL Server 2008 或更高版本,这将适用于您。我使用 row_number 并从最大日期开始按 ID 分配值。因此,任何高于 1 的值都低于该特定 ID 的最大日期,因此我删除大于 1 的 row_num。

检查一下:

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

【讨论】:

    【解决方案2】:

    试试这个

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

    【讨论】:

      【解决方案3】:

      如果你有重复的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)
      

      【讨论】:

        猜你喜欢
        • 2021-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-09
        • 1970-01-01
        • 2019-07-17
        相关资源
        最近更新 更多