Из моего опыта самый быстрый способ - это взять каждую строку, для которой в таблице нет новой строки. Вот небольшой тест с некоторыми данными, которые у меня под рукой.
Еще одним преимуществом является то, что используемый синтаксис очень прост и что значение запроса довольно легко понять (возьмите все строки так, чтобы для рассматриваемого имени пользователя не было новой строки).
НЕ СУЩЕСТВУЕТ
SELECT username, value
FROM t
WHERE NOT EXISTS (
SELECT *
FROM t AS witness
WHERE witness.date > t.date
);
Объясните общую стоимость: 2.38136
ROW_NUMBER
SELECT username, value
FROM (
SELECT username, value, row_number() OVER (PARTITION BY username ORDER BY date DESC) AS rn
FROM t
) t2
WHERE rn = 1
Общая стоимость: 61,5823
ВНУТРЕННИЙ РЕЙТИНГ
SELECT t.username, t.value
FROM t
INNER JOIN (
SELECT username, MAX(date) AS date
FROM t
GROUP BY username
) tm ON t.username = tm.username AND t.date = tm.date;
Объясните общую стоимость: 67,5439
ВЛЕВО НАРУЖНОЕ СОЕДИНЕНИЕ
SELECT username, value
FROM t
LEFT OUTER JOIN t AS w ON t.username = w.username AND t.date < w.date
WHERE w.username IS NULL
Объясните общую стоимость: 62,964
Планы объяснения поступают из базы данных с примерно 10 тыс. Строк, которые хранятся в формате XML. Используемые запросы также содержат предикат "group_id = '1'".