sql >> Base de Datos >  >> RDS >> Mysql

Distancia mínima y grupo por

Aquí es un excelente artículo en la documentación oficial de MySQL:

Cita:

Las filas que contienen el máximo por grupo de una determinada columna

Tarea:Para cada artículo, encuentre el distribuidor o distribuidores con el precio más caro.

Este problema se puede resolver con una subconsulta como esta:

SELECT article, dealer, price
FROM   shop s1
WHERE  price=(SELECT MAX(s2.price)
              FROM shop s2
              WHERE s1.article = s2.article);

El ejemplo anterior utiliza una subconsulta correlacionada, que puede ser ineficiente (consulte la Sección 13.2.10.7, “Subconsultas correlacionadas”). Otras posibilidades para resolver el problema son usar una subconsulta no correlacionada en la cláusula FROM o LEFT JOIN.

Subconsulta no 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;

UNIÓN IZQUIERDA:

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;

LEFT JOIN funciona sobre la base de que cuando s1.price está en su valor máximo, no hay s2.price con un valor mayor y los valores de s2 filas serán NULL.