Вот как бы я это сделал. ROW_NUMBER()
требует SQL Server 2005 или более поздней версии
Пример данных:
DECLARE @foo TABLE (
id int,
rev int,
field nvarchar(10)
)
INSERT @foo VALUES
( 1, 1, 'test1' ),
( 2, 1, 'fdsfs' ),
( 3, 1, 'jfds' ),
( 1, 2, 'test2' )
Запрос:
DECLARE @desiredRev int
SET @desiredRev = 2
SELECT * FROM (
SELECT
id,
rev,
field,
ROW_NUMBER() OVER (PARTITION BY id ORDER BY rev DESC) rn
FROM @foo WHERE rev <= @desiredRev
) numbered
WHERE rn = 1
Внутренний SELECT
возвращает все соответствующие записи, и в каждой группе id
(это PARTITION BY
) вычисляет номер строки, если упорядочен по убыванию rev
.
Внешний SELECT
просто выбирает первого члена (то есть члена с наибольшим rev
) из каждой группы id
.
Вывод при @desiredRev = 2
:
id rev field rn
----------- ----------- ---------- --------------------
1 2 test2 1
2 1 fdsfs 1
3 1 jfds 1
Вывод при @desiredRev = 1
:
id rev field rn
----------- ----------- ---------- --------------------
1 1 test1 1
2 1 fdsfs 1
3 1 jfds 1