删除部分重复忽略 SQL 中的空值
Removing Partial Duplicates Ignoring Nulls in SQL
我有一个 table,其中包含两个可能的唯一标识符(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
不幸的是,这也删除了我所有的空值!如何修改此查询以避免删除空值?
编辑:
这是我的数据的示例(如果有人知道如何格式化 tables,请告诉我。我使用了 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 初学者,找不到与我正在寻找的完全相同的内容。
怎么样:
DELETE FROM CTE
WHERE RN<>1
AND ID1 IS NOT NULL
使用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
我有一个 table,其中包含两个可能的唯一标识符(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
不幸的是,这也删除了我所有的空值!如何修改此查询以避免删除空值?
编辑: 这是我的数据的示例(如果有人知道如何格式化 tables,请告诉我。我使用了 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 初学者,找不到与我正在寻找的完全相同的内容。
怎么样:
DELETE FROM CTE
WHERE RN<>1
AND ID1 IS NOT NULL
使用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