Выберите последнюю редакцию каждой строки в таблице.
-
07-07-2019 - |
Вопрос
У меня есть структуры таблиц, которые включают составной первичный ключ идентификатора и версии, где оба являются целыми числами.
Мне нужен запрос, который вернет последнюю версию каждой строки.Если бы я понял этот ответ правильно, то с БД Oracle работало бы следующее.
SELECT Id, Title
FROM ( SELECT Id, Revision, MAX(Revision) OVER (PARTITION BY Id) LatestRevision FROM Task )
WHERE Revision = LatestRevision
Я использую SQL Server (2005) и мне нужен производительный запрос, чтобы сделать то же самое.
Решение
См. этот сообщение от ayende для оценки лучших стратегий. Р>
Другие советы
Я думаю, что это должно работать (я не проверял это) ...
SELECT ID,
Title
FROM Task AS T
INNER JOIN
(
SELECT ID,
Max(Revision)
FROM Task
GROUP BY ID
) AS sub
ON T.ID = sub.ID
AND T.Revision = sub.Revision
Я бы попытался создать такой подзапрос, как этот:
SELECT Id, заголовок FROM Task T, (выберите ID, Max (Revision) MaxRev из группы задач по ID) LatestT ГДЕ T.Revision = LatestT.MaxRev и T.ID = LatestT.ID
Другой вариант - "обмануть" и создайте триггер, который пометит ревизию как последнюю ревизию, если добавлен один элемент. Затем добавьте это поле в индекс. (Я бы связал таблицу только для вставки)
Также индекс по идентификатору, Revision desc может помочь производительности
Отправленный вами запрос будет работать в SQL 2005 (в режиме совместимости 90) с исправленными синтаксическими ошибками:
SELECT t1.Id, t1.Title
FROM ( SELECT Id, Revision, MAX(Revision) OVER (PARTITION BY Id) LatestRevision FROM Task ) AS x
JOIN Task as t1
ON t1.Revision = x.LatestRevision
AND t1.id = x.id
попробуй это:
DECLARE @YourTable table(RowID int, Revision int, Title varchar(10))
INSERT INTO @YourTable VALUES (1,1,'A')
INSERT INTO @YourTable VALUES (2,1,'B')
INSERT INTO @YourTable VALUES (2,2,'BB')
INSERT INTO @YourTable VALUES (3,1,'C')
INSERT INTO @YourTable VALUES (4,1,'D')
INSERT INTO @YourTable VALUES (1,2,'AA')
INSERT INTO @YourTable VALUES (2,3,'BBB')
INSERT INTO @YourTable VALUES (5,1,'E')
INSERT INTO @YourTable VALUES (5,2,'EE')
INSERT INTO @YourTable VALUES (4,2,'DD')
INSERT INTO @YourTable VALUES (4,3,'DDD')
INSERT INTO @YourTable VALUES (6,1,'F')
;WITH YourTableRank AS
(
SELECT
RowID,Revision,Title, ROW_NUMBER() OVER(PARTITION BY RowID ORDER BY RowID,Revision DESC) AS Rank
FROM @YourTable
)
SELECT
RowID, Revision, Title
FROM YourTableRank
WHERE Rank=1
ВЫХОД:
RowID Revision Title
----------- ----------- ----------
1 2 AA
2 3 BBB
3 1 C
4 3 DDD
5 2 EE
6 1 F
(6 row(s) affected)