Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Distância mínima e agrupamento por


Aqui é um excelente artigo na documentação oficial do MySQL:

Citar:

As linhas que mantêm o máximo em grupo de uma determinada coluna


Tarefa:Para cada artigo, encontre o revendedor ou revendedores com o preço mais caro.

Este problema pode ser resolvido com uma subconsulta como esta:
SELECT article, dealer, price
FROM   shop s1
WHERE  price=(SELECT MAX(s2.price)
              FROM shop s2
              WHERE s1.article = s2.article);

O exemplo anterior usa uma subconsulta correlacionada, que pode ser ineficiente (consulte a Seção 13.2.10.7, “Subconsultas correlacionadas”). Outras possibilidades para resolver o problema são usar uma subconsulta não correlacionada na cláusula FROM ou um LEFT JOIN.

Subconsulta não correlacionada:
SELECT s1.article, dealer, s1.price
FROM shop s1
JOIN (
  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.price
FROM shop s1
LEFT JOIN shop s2 ON s1.article = s2.article AND s1.price < s2.price
WHERE s2.article IS NULL;

O LEFT JOIN funciona com base em que quando s1.price está em seu valor máximo, não há s2.price com um valor maior e os valores de s2 rows serão NULL.