Удаление частичных дубликатов, игнорирующих пустые значения в SQL - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть таблица с двумя возможными уникальными идентификаторами (ID1 и ID2).Каждая строка будет иметь один или оба из этих идентификаторов.Данные в каждой строке одинаковы для каждого идентификатора, за исключением отметки времени.Я хотел бы исключить дубликаты из каждого значения, но обрабатывать пустые значения как уникальные значения.

Этот вопрос: Как удалить дублирующиеся строки на сервере sql?

Направил меня наэтот сайт: 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 и не смог найти ничего такого, как яищу.

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

использовать 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
0 голосов
/ 05 февраля 2019

как насчет:

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