Расширенный дедупликация таблиц - PullRequest
0 голосов
/ 19 сентября 2018

есть вопрос ... У меня есть таблица с более чем 2 миллиардами строк.Многие из них являются дубликатами, но есть столбец (varchar) с датой действия в таком формате, как 201806.

Я хочу дедуплицировать таблицу, НО сохранить самую последнюю дату.

ex.

ID,fname, lname, addrees, city, state, zip, validitydate
1,steve,smith, pob 123, miami, fl. 33081,201709
2,steve,smith, pob 123, miami, fl. 33081,201010
3,steve,smith, pob 123, miami, fl. 33081,201809
4.steve,smith, pob 123, miami, fl. 33081,201201

Я хочу оставить только: Стив, Смит, POB 123, Майами, FL.33081,201809, так как это самый актуальный.Если я запускаю нижеприведенное, он выводит, но это дерьмо, которое осталось в таблице, так как я не могу добавить validityDate, так как tsql будет выглядеть как все из них как уникальные.

Как я могусделать так, чтобы он выводил, но рассчитывал сохранить самую последнюю дату в качестве окончательной записи?

заранее спасибо.

WITH Records AS 
(
SELECT fname, lname, addrees, city, 
ROW_NUMBER() OVER (
  PARTITION BY fname, lname, addrees, city, state, zip, 
    validitydate by ID) AS RecordInstance 
FROM PEOPLE where lastname like 'S%'
)
DELETE
 FROM Records 
WHERE
 RecordInstance > 1

Ответы [ 3 ]

0 голосов
/ 20 сентября 2018

Удаление также будет работать только с ROW_NUMBER в CTE.Который упорядочен по убыванию даты действия.Таким образом, самый последний месяц будет иметь row_number 1, и вы можете удалить их> 1

WITH CTE AS
(
   SELECT 
   ROW_NUMBER() OVER (PARTITION BY fname, lname, addrees, city, state, zip ORDER BY validitydate DESC, ID DESC) AS rn
   FROM PEOPLE
   WHERE lname like 'S%'
)
DELETE 
FROM CTE
WHERE rn > 1;

Тест можно найти здесь

0 голосов
/ 20 сентября 2018

Вот ссылка на статью, которую я написал относительно этой самой проблемы.

https://sqlfundamentals.wordpress.com/delete-duplicate-rows-in-t-sql/

Надеюсь, это поможет.

0 голосов
/ 20 сентября 2018

Порядок по месяцам (по убыванию), поэтому RecordInstance будет 1 для самого последнего:

WITH Records AS (
  SELECT fname, lname, addrees, city,
     ROW_NUMBER() OVER (
       PARTITION BY fname, lname, addrees, city, state, zip
       ORDER BY validitydate DESC -- Add this to order correctly!
     ) AS RecordInstance
  FROM PEOPLE where lastname like 'S%' 
)
DELETE FROM Records WHERE RecordInstance > 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...