sql >> Databáze >  >> RDS >> Mysql

Získejte záznamy s maximální hodnotou pro každou skupinu seskupených výsledků SQL

Správné řešení je:

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

Jak to funguje:

Odpovídá každému řádku z o se všemi řádky z b se stejnou hodnotou ve sloupci Group a větší hodnotu ve sloupci Age . Libovolný řádek z o nemá maximální hodnotu své skupiny ve sloupci Age bude odpovídat jednomu nebo více řádkům z b .

LEFT JOIN způsobí, že nejstarší osoba ve skupině (včetně osob, které jsou ve své skupině osamocené) odpovídá řádku plnému NULL s z b ('žádný největší věk ve skupině').
Pomocí INNER JOIN způsobí, že se tyto řádky neshodují a budou ignorovány.

WHERE klauzule zachovává pouze řádky s NULL s v polích extrahovaných z b . Jsou to nejstarší osoby z každé skupiny.

Další čtení

Toto řešení a mnoho dalších jsou vysvětleny v knize SQL Antipatterns:Avoiding the Pitfalls of Database Programming



  1. co je oracle EBS R12

  2. Z uložené procedury vraťte parametr OUT a kurzor OUT a výsledek analýzy (Oracle)

  3. SQL Server a zranitelnosti Spectre/Meltdown

  4. Úspěšné strategie zálohování a obnovy MySQL/MariaDB