Удаление дублирующихся комбинаций строк в заданную дату - PullRequest
5 голосов
/ 15 марта 2019

Итак, у меня есть набор данных около 160 000 записей, они сгенерированы компьютером и с годами произошли ошибки.

Допустим, в таблице есть следующие столбцы:

- EntryID (auto int)
- FruitNumber
- JuiceNumber
- CandyNumber
- Date

Теперь важно то, что каждая комбинация FruitNumber, JuiceNumber,CandyNumber является уникальной, если время между ними составляет менее 12 месяцев.

Это означает, что каждая их точная комбинация может существовать только один раз в 12 месяцев.Теперь мне нужно перенести этот набор данных в новую модель данных, и для этого мне нужно удалить дубликаты записей (но сохранить одну из них), я много пробовал с помощью запросов, но не смог найти решение.

Ответы [ 2 ]

1 голос
/ 15 марта 2019

Попробуйте использовать cte:

;WITH cte AS 
(
SELECT 
  ft.EntryID
, ft.FruitNumber
, ft.JuiceNumber
, ft.CandyNumber
, ft.Date
, ROW_NUMBER() OVER (PARTITION BY ft.FruitNumber, ft.JuiceNumber, ft.CandyNumber 
     ORDER BY ft.FruitNumber) RN
, DENSE_RANK() OVER (ORDER BY ft.FruitNumber, ft.JuiceNumber, ft.CandyNumber) 
     AS Partitionid
, COUNT(1) OVER (PARTITION BY ft.FruitNumber, ft.JuiceNumber, ft.CandyNumber 
     ORDER BY ft.FruitNumber) as PartitionCNT
FROM FooTable ft
)

SELECT 
t1.* 
, DATEDIFF(DAY, t.Date, t1.Date) DATEDiff
FROM 
cte t 
INNER JOIN cte t1 
    ON t1.FruitNumber = t.FruitNumber
        AND  t1.JuiceNumber = t.JuiceNumber
        AND  t1.CandyNumber = t.CandyNumber
        AND DATEDIFF(DAY, t.Date, t1.Date)>= 365
WHERE t.PartitionCNT > 1

И пример данных:

CREATE TABLE FooTable
(
    EntryID INT IDENTITY(1, 1) PRIMARY KEY,
    FruitNumber INT,
    JuiceNumber INT,
    CandyNumber INT,
    [Date] DATETIME
);*/


INSERT INTO FooTable
VALUES
(1, 2, 3 , '2019-03-01 00:00:00.000'),
(1, 2, 3 , '2020-03-01 00:00:00.000'),
(4, 5, 6 , '2019-03-01 00:00:00.000'),
(7, 8, 9 , '2019-03-01 00:00:00.000'),
(10, 11, 12 , '2018-03-20 00:00:00.000'),
(13, 14, 15 , '2018-03-20 00:00:00.000'),
(16, 17, 18 , '2017-03-09 00:00:00.000'),
(16, 17, 18 , '2017-02-09 00:00:00.000'),
(22, 23, 34 , '2017-02-12 00:00:00.000'),
(22, 23, 34 , '2017-02-12 00:00:00.000');

И ВЫХОД:

EntryID FruitNumber JuiceNumber CandyNumber
   2           1           2          3 
0 голосов
/ 15 марта 2019

Если ошибки являются случайными, это может сработать:

select t.*
from (select t.*,
             lag(date) over (partition by FruitNumber, JuiceNumber, CandyNumber) as prev_date
      from t
     ) t
where prev_date is null or prev_date < dateadd(year, -1, date);

Это не общее решение, хотя этот запрос можно выполнить несколько раз.В частности, это работает, только если у вас есть не более одного дубликата в течение года.

К сожалению, общее решение требует рекурсивных CTE.Например, если у вас есть записи каждый месяц, сложно понять, как вести записи за январь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...