Mysql
 sql >> база данни >  >> RDS >> Mysql

Вземете записи с максимална стойност за всяка група групирани SQL резултати

Правилното решение е:

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

Как работи:

Той съответства на всеки ред от o с всички редове от b имащи същата стойност в колона Group и по-голяма стойност в колона Age . Всеки ред от o няма максимална стойност на своята група в колона Age ще съответства на един или повече редове от b .

LEFT JOIN го прави да съответства на най-възрастния човек в групата (включително хората, които са сами в групата си) с ред, пълен с NULL s от b („няма най-голяма възраст в групата“).
Използване на INNER JOIN прави тези редове да не съвпадат и те се игнорират.

WHERE клаузата запазва само редовете с NULL s в полетата, извлечени от b . Те са най-възрастните от всяка група.

Допълнителни прочити

Това решение и много други са обяснени в книгата SQL Antipatterns:Избягване на клопките на програмирането на бази данни



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ROW_NUMBER в SQL – Изберете Най-добър пример в SQL и SQL Server

  2. Пишете с главни букви първата буква на всяка дума в съществуващата таблица

  3. PHP/MySQL Вмъкване на нулеви стойности

  4. Как да разделите низ в MySQL

  5. 3 начина за „дехексиране“ на низ в MySQL