на основе следующей таблицыT-SQL-запрос: получить последнюю строку подходов
Table_A
ID Rev Description
-----------------------------------
1 1 Some text.
1 2 Some text. Adding more.
1 3 Some text. Ading more & more.
выше будет продолжать добавлять новую строку, когда пользователь обновляет описание.
Я хочу взять строку с MAX (Rev) [т. последнее описание].
Чтобы получить это я следующее:
;with AllDescriptions As
(
select
ID
, Rev
, Description
, ROW_NUMBER() over (partition by ID order by Rev desc) as RowNum
from Table_A
Where ID = 1
)
select ID, Rev, Description from AllDescription
where RowNum = 1
Недавно я увидел другой подход к получению такого же результата
select b.* from
(
select ID, MAX(Rev) as MaxRev
from Table_A
where ID = 1
group by ID
) as a
inner join
(
select ID, Rev, Description from Table_A where ID = 1
) as b
on a.ID = b.ID and a.MaxRev = b.Rev
С точки зрения усвоения знаний, я хочу знать, какие из указанных выше двух подходы лучше? Или если есть еще лучший способ сделать то же самое?
Проверьте планы выполнения. Версия 2 может демонстрировать магию оптимизатора с одним поиском плюс раздел. Я видел этот пример раньше, не помню, где. * Внутри SQL Server 2008: программирование T-SQL *, возможно? –
@Peter - Кажется, я помню, что они сравнивали с JOIN или CROSS APPLY с «ТОП-1» в тех книгах, которые я забыл. –
Я только что попробовал оба - 'STATISTICS IO' дает почти одинаковое количество чтений для обеих опций с поддерживающим кластеризованным индексом в таблице. В плане запроса указано, что вариант ROW_NUMBER намного дороже. «Стоимость запроса относительно пакета» - но я думаю, что это вводит в заблуждение в этом случае. –