# 3.6.4. The Rows Holding the Group-wise Maximum of a Certain Column

Task: For each article, find the dealer or dealers with the most expensive price.

This problem can be solved with a subquery like this one:

`SELECT article, dealer, priceFROM   shop s1WHERE  price=(SELECT MAX(s2.price)              FROM shop s2              WHERE s1.article = s2.article);+---------+--------+-------+| article | dealer | price |+---------+--------+-------+|    0001 | B      |  3.99 ||    0002 | A      | 10.99 ||    0003 | C      |  1.69 ||    0004 | D      | 19.95 |+---------+--------+-------+`

The preceding example uses a correlated subquery, which can be inefficient (see Section 13.2.10.7, "Correlated Subqueries"). Other possibilities for solving the problem are to use an uncorrelated subquery in the `FROM` clause or a `LEFT JOIN`.

Uncorrelated subquery:

`SELECT s1.article, dealer, s1.priceFROM shop s1JOIN (  SELECT article, MAX(price) AS price  FROM shop  GROUP BY article) AS s2  ON s1.article = s2.article AND s1.price = s2.price;`

`LEFT JOIN`:

`SELECT s1.article, s1.dealer, s1.priceFROM shop s1LEFT JOIN shop s2 ON s1.article = s2.article AND s1.price < s2.priceWHERE s2.article IS NULL;`

The `LEFT JOIN` works on the basis that when `s1.price` is at its maximum value, there is no `s2.price` with a greater value and the `s2` rows values will be `NULL`. See Section 13.2.9.2, "`JOIN` Syntax".

Spec-Zone.ru - all specs in one place