Это проблема greatest-n-per-group
, которая часто возникает. Мой обычный способ ее решения логически эквивалентен ответу, заданному @Martin Smith, но не использует подзапрос:
SELECT T1.Id, T1.name, T1.type, T1.price
FROM Table T1
LEFT OUTER JOIN Table T2
ON (T1.type = T2.type AND T1.price < T2.price)
WHERE T2.price IS NULL;
Мое решение и все остальные, приведенные в этой теме, могут создать несколько строк на значение type
, если более одного продукта имеют одинаковый тип, и обе имеют одинаковую цену, которая является максимальной. Есть способы решить эту проблему и разорвать связь, но вы должны сообщить нам, какой продукт «выигрывает» в таком случае.
Вам нужен какой-то другой атрибут, который гарантированно будет уникальным для всех строк, по крайней мере, для строк с одинаковым type
. Например, если продукт с большим значением Id
должен выиграть, вы можете разрешить связь следующим образом:
SELECT T1.Id, T1.name, T1.type, T1.price
FROM Table T1
LEFT OUTER JOIN Table T2
ON (T1.type = T2.type AND (T1.price < T2.price
OR T1.price = T2.price AND T1.Id < T2.Id))
WHERE T2.price IS NULL;