Удалить дубликаты записей, оставив только самую последнюю - PullRequest
2 голосов
/ 19 марта 2019

У меня есть таблица в MSSQL с именем answers, которая выглядит следующим образом:

ID Answer Country_ID Question_ID Updated
1  ans1    15          20        2018-10-14 13:17:02.680
2  ans2    15          20        2018-11-19 13:17:02.680
3  ans0    15          20        2018-11-20 13:17:02.680
4  ans5    15          22        2018-10-14 13:17:02.680

Мне нужно сделать следующее:

  • Копирование из таблицы отвечает дублированным записям в соответствии с Question_ID для данного идентификатора страны в таблицу answersArchive и удаляет их из answers

Я понимаю, что в результате мне нужно 2 запроса для этого. В настоящее время я хотел просто запросить самые последние ответы (имеющие максимальное (обновленное) значение), но как-то результат запроса неверен:

select *
from answers a
inner join (
    select Question_ID, max(Updated) as MaxDate
    from answers
    WHERE Country_ID = 15
    group by Question_ID
) a2 on a.Question_ID = a2.Question_ID and a.Updated = a2.MaxDate
where a.Country_ID = 15
order by a.Question_ID;

Любая подсказка приветствуется.

Ответы [ 2 ]

2 голосов
/ 19 марта 2019

Вы можете использовать Count с partition by, чтобы найти и вставить дубликаты записей в таблицу answersArchive, как показано ниже.

1 - Найти дубликат и вставить в answersArchive таблицу

--copy the duplicate records
;WITH cte 
     AS (SELECT id, 
                answer, 
                country_id, 
                question_id, 
                updated, 
                Count(*) 
                  OVER( 
                    partition BY question_id ) ct 
         FROM   answers 
         WHERE  country_id = 15) 
INSERT INTO answersarchive 
SELECT id, 
       answer, 
       country_id, 
       question_id, 
       updated 
FROM   cte 
WHERE  ct > 1 --Give you duplicate records 

2 - Удалить все дубликаты, кроме самого последнего.

Вы можете использовать CTE, чтобы удалить записи. Чтобы найти дубликаты записей, вы можете использовать ROW_NUMBER() с PARTITION BY question_id, как в следующем запросе.

;WITH cte 
     AS (SELECT id, 
                answer, 
                country_id, 
                question_id, 
                updated, 
                Row_number() 
                  OVER( 
                    partition BY question_id 
                    ORDER BY updated DESC) RN 
         FROM   answers 
         WHERE  country_id = 15) 

DELETE FROM cte 
WHERE  rn > 1 
2 голосов
/ 19 марта 2019

используйте row_number() аналитическую функцию

 with cte as
(
 select t.*,row_number()over(partition by Question_ID order by Updated desc) rn
 from answers t
 where country_id=15
) delete from cte where rn<>1

--- вы можете использовать фильтр страны внутри или снаружи cte

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