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

Obtenha registros com valor máximo para cada grupo de resultados SQL agrupados


A solução correta é:
SELECT o.*
FROM `Persons` o                    # 'o' from 'oldest person in group'
  LEFT JOIN `Persons` b             # 'b' from 'bigger age'
      ON o.Group = b.Group AND o.Age < b.Age
WHERE b.Age is NULL                 # bigger age not found

Como funciona:


Ele corresponde a cada linha de o com todas as linhas de b tendo o mesmo valor na coluna Group e um valor maior na coluna Age . Qualquer linha de o não ter o valor máximo de seu grupo na coluna Age corresponderá a uma ou mais linhas de b .

O LEFT JOIN faz com que corresponda à pessoa mais velha do grupo (incluindo as pessoas que estão sozinhas em seu grupo) com uma linha cheia de NULL s de b ('nenhuma idade maior no grupo').
Usando INNER JOIN faz com que essas linhas não correspondam e sejam ignoradas.

O WHERE cláusula mantém apenas as linhas com NULL s nos campos extraídos de b . São as pessoas mais velhas de cada grupo.

Mais leituras


Esta solução e muitas outras são explicadas no livro SQL Antipatterns:Avoiding the Pitfalls of Database Programming