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