Все, что вам нужно, - это предложение GROUP BY
с агрегатной функцией MAX
:
SELECT id, MAX(rev)
FROM YourTable
GROUP BY id
Я просто заметил, что вам нужен столбец content
.
Это очень распространенный вопрос в SQL: найти все данные для строки с некоторым максимальным значением в столбца на один идентификатор группы. Я много слышал о своей карьере. На самом деле, это был один из вопросов, которые я ответил в техническом интервью моей текущей работы.
На самом деле настолько распространено, что сообщество StackOverflow создало один тег только для решения таких вопросов: наибольшее-n-на-группу .
В принципе, у вас есть два подхода к решению этой проблемы:
group-identifier, max-value-in-group
Sub-query В этом подходе вы сначала найдете group-identifier, max-value-in-group
(уже решены выше) в подзапросе. Затем вы присоединяетесь к своей таблице к подзапросу с равенством как на group-identifier
, так и на max-value-in-group
:
SELECT a.id, a.rev, a.contents
FROM YourTable a
INNER JOIN (
SELECT id, MAX(rev) rev
FROM YourTable
GROUP BY id
) b ON a.id = b.id AND a.rev = b.rev
In этот подход, вы оставили присоединиться к таблице с собой. Равенство, конечно, идет в group-identifier
. Затем два умных перемещения:
NULL
в правой части (это LEFT JOIN
, помните?). Затем мы фильтруем объединенный результат, показывая только строки, где правая сторона NULL
. Итак, вы закончите:
SELECT a.*
FROM YourTable a
LEFT OUTER JOIN YourTable b
ON a.id = b.id AND a.rev < b.rev
WHERE b.id IS NULL;
Оба подхода приносят точный результат.
Если у вас есть две строки с max-value-in-group
для group-identifier
, обе строки будут в результате в обоих подходах.
Оба подхода совместимы с SQL ANSI, таким образом, будут работать с вашей любимой РСУБД, независимо от ее «вкуса».
Оба подхода также дружелюбны к производительности, однако ваш пробег может варьироваться (РСУБД, структура БД, индексы и т. д.). Поэтому, когда вы выбираете один подход над другим, benchmark . И убедитесь, что вы выбрали тот, который вам больше всего подходит.
Если вы управляете (пишете код для) как сервером, так и клиентом, вы можете добавить метод к вашему COM-интерфейсу, который вернет идентификатор процесса / потока или что-либо подобное (например, имя хоста сервера, если оно удалено) на конец сервера. Я второй @Hans - если у вас нет доступа к реализации сервера, вам может быть не повезло по дизайну.