SELECT t1.*
FROM yourtable t1
LEFT OUTER JOIN yourtable t2
ON (t1.name = t2.name AND t1.seqnum > t2.seqnum)
WHERE t2.seqnum IS NULL;
Re. Комментарий Демса:
Если вы просто используете GROUP BY name
, тогда ваш список выбора может включать только name
и функцию агрегирования MIN()
. Часто бывает так, что вам действительно нужна вся строка, в которой минимальное значение встречается на группу.
Если вы используете решение TOP
(или LIMIT
, если вы используете MySQL, PostgreSQL, SQLite), то вы не можете получить минимум для нескольких групп на основе name
, вы можете получить только минимум для один name
.
Я прочел между строк вопроса ОП и догадался, что они хотят целую строку, что столбцов больше, чем показано в вопросе (всегда есть), и что требуемый запрос должен возвращать результаты для нескольких имен, не только один.
Re. Комментарий SquareCog:
Решение, которое вы предлагаете, также является объединением:
SELECT t1.*
FROM yourtable t1
JOIN (SELECT name, MIN(seqnum) AS seqnum FROM yourtable GROUP BY name) t2
USING (name, seqnum);
Однако это решение, вероятно, не может использовать индексы для оценки объединения, тогда как решение, которое я дал, может.