【问题标题】:Removing Partial Duplicates Ignoring Nulls in SQL删除部分重复忽略 SQL 中的空值
【发布时间】:2019-02-06 02:09:18
【问题描述】:

我有一个表,其中包含两个可能的唯一标识符(ID1 和 ID2)。每行将具有这些标识符中的一个或两个。除了时间戳之外,每个 ID 的每一行中的数据都完全相同。我想消除每个值的重复值,但将空值视为唯一值。

这个问题: How to delete duplicate rows in sql server?

推荐我到这个网站: http://www.codaffection.com/sql-server-article/delete-duplicate-rows-in-sql-server/

我在哪里提出了以下查询:

WITH CTE AS
(
SELECT *,ROW_NUMBER() OVER (PARTITION BY ID1 ORDER BY ID1) AS RN
FROM Filings_Search
)

DELETE FROM CTE WHERE RN<>1

不幸的是,这也删除了我所有的空值!如何修改此查询以避免删除空值?

编辑: 这是我的数据的示例(如果有人知道如何很好地格式化表格,请告诉我。我使用了https://senseful.github.io/text-table/)。

+------+------+----------+-----------+
| ID1  | ID2  |   Data   | Timestamp |
+------+------+----------+-----------+
| NULL | abc  | macd     | 01:40     |
| NULL | abc  | macd     | 04:23     |
| NULL | def  | pfchangs | 01:41     |
| 123  | NULL | wendys   | 02:42     |
| 123  | NULL | wendys   | 03:45     |
+------+------+----------+-----------+

在 ID1 上运行会输出:

+------+------+----------+-----------+
| ID1  | ID2  |   Data   | Timestamp |
+------+------+----------+-----------+
| NULL | abc  | macd     | 01:40     |
| NULL | abc  | macd     | 04:23     |
| NULL | def  | pfchangs | 01:41     |
| 123  | NULL | wendys   | 02:42     |
+------+------+----------+-----------+

在 ID2 上运行会输出:

+------+------+----------+-----------+
| ID1  | ID2  |   Data   | Timestamp |
+------+------+----------+-----------+
| NULL | abc  | macd     | 01:40     |
| NULL | def  | pfchangs | 01:41     |
| 123  | NULL | wendys   | 02:42     |
| 123  | NULL | wendys   | 03:45     |
+------+------+----------+-----------+

抱歉,如果这是重复的,我是一个 SQL 初学者,找不到与我正在寻找的完全一样的东西。

【问题讨论】:

  • 向我们展示数据库架构、示例数据、当前和预期输出。请阅读How-to-Ask 这里是START 了解如何提高问题质量并获得更好答案的好地方。
  • NULL 值是多少?现在还不清楚什么是数据以及要删除的行以及要保留的行。所以除了猜测之外,我们真的无法帮助您。
  • 要格式化为code,选择文本并按ctrl-k或在每行前添加4个空格

标签: sql duplicates sql-delete


【解决方案1】:

怎么样:

 DELETE FROM CTE 
 WHERE RN<>1
   AND ID1 IS NOT NULL

【讨论】:

  • 你应该把你的ORDER BY ID1改成ORDER BY timestamp
  • 如果能帮助您解决问题,请考虑用绿色勾号将此答案标记为正确
【解决方案2】:

使用 ID2 和分区中的数据

   WITH CTE AS (
        SELECT f.*, ROW_NUMBER() OVER (PARTITION BY  ID2,data ORDER BY Timestamp ) AS RN
        FROM Filings_Search 
    )
    DELETE FROM CTE WHERE RN<>1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    • 2020-10-22
    • 2014-07-10
    • 2019-07-30
    • 2019-10-05
    • 2023-02-02
    相关资源
    最近更新 更多