#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