Фильтр по дате во временной таблице

Присутствует примерно следующий запрос:

CREATE TABLE #Productr (date_time date, id varchar(50), type varchar(50));
INSERT INTO #Productr VALUES
('2020-07-01',    '11',    'PC'),
('2021-02-09',    '11',    'Printer'),
('2019-01-29',    '22',    'Phone'),
('2018-03-14',    '22',    'Charger'),
('2020-04-19',    '22',    'Phone');
 
 --select * from #Productr
 --drop table #Productr

Подскажите, каким образом я могу с помощью временной таблицы достать заявки, кроме последних по дате? Что хочу получить на выходе:

date_time   id  type
2020-07-01  11  PC
2019-01-29  22  Phone
2018-03-14  22  Charger 

Ответы (1 шт):

Автор решения: teran

исходные

declare @t table (d date, id varchar(50), t varchar(50));
INSERT INTO @t VALUES
    ('2020-07-01',    '11',    'PC'),
    ('2021-02-09',    '11',    'Printer'),
    ('2019-01-29',    '22',    'Phone'),
    ('2018-03-14',    '22',    'Charger'),
    ('2020-04-19',    '22',    'Phone');

Способ первый - найти максимальные даты товаров, сделать джойн с условием, что нужна дата меньше максимальной.

SELECT t.*
FROM @t as t
INNER JOIN (
    SELECT id, max(d) AS d
    FROM @t
    GROUP BY id
) AS m ON ( m.id = t.id and t.d < m.d )

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

WITH x AS (
    select d, id, t, row_number() over (partition by id order by d desc) as rn
    from @t
)
SELECT d, id, t
FROM x
WHERE rn > 1
→ Ссылка