Найти повторяющиеся строки и показать только самые ранние

#sql-server

#sql-сервер

Вопрос:

У меня есть следующая таблица:

 respid, uploadtime
  

Мне нужен запрос, который покажет все записи, которые дублируют respid, и покажет их, кроме последней (по времени загрузки)
пример:

 4   2014-01-01
4   2014-06-01 
4   2015-01-01
4   2015-06-01
4   2016-01-01 
  

В этом случае запрос должен вернуть четыре записи (последняя: 4 2016-01-01)

Большое вам спасибо.

Ответ №1:

Используйте ROW_NUMBER :

 WITH cte AS (
    SELECT respid, uploadtime,
           ROW_NUMBER() OVER (PARTITION BY respid ORDER BY uploadtime DESC) rn
    FROM yourTable
)

SELECT respid, uploadtime
FROM cte
WHERE rn > 1
ORDER BY respid, uploadtime;
  

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

Ответ №2:

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

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

Пример данных

 declare @MyTable table
(
    respid int,
    uploadtime date
);

insert into @MyTable (respid, uploadtime) values
(4, '2014-01-01'),
(4, '2014-06-01'),
(4, '2015-01-01'),
(4, '2015-06-01'),
(4, '2016-01-01'),  --> last duplicate of respid=4, not part of result
(5, '2020-01-01');  --> has no duplicate, not part of result
  

Решение

 select mt.respid, mt.uploadtime
from @MyTable mt
where exists (  select top 1 'x'
                from @MyTable mt2
                where mt2.respid = mt.respid
                  and mt2.uploadtime > mt.uploadtime );
  

Результат

 respid      uploadtime
----------- ----------
4           2014-01-01
4           2014-06-01
4           2015-01-01
4           2015-06-01