mysql select top n max значения

Как вы можете выбрать верхние значения n max из таблицы?

Для таблицы, например:

column1 column2 1 foo 2 foo 3 foo 4 foo 5 bar 6 bar 7 bar 8 bar 

Для n = 2 результат должен быть:

 3 4 7 8 

Приведенный ниже подход выбирает только максимальное значение для каждой группы.

 SELECT max(column1) FROM table GROUP BY column2 

Возвращает:

 4 8 

    При n = 2 вы могли бы

     SELECT max(column1) m FROM table t GROUP BY column2 UNION SELECT max(column1) m FROM table t WHERE column1 NOT IN (SELECT max(column1) WHERE column2 = t.column2) 

    для любого n вы можете использовать описанные здесь подходы для имитации ранжирования над разделом.

    EDIT: На самом деле эта статья даст вам именно то, что вам нужно.

    В основном это что-то вроде этого

     SELECT t.* FROM (SELECT grouper, (SELECT val FROM table li WHERE li.grouper = dlo.grouper ORDER BY li.grouper, li.val DESC LIMIT 2,1) AS mid FROM ( SELECT DISTINCT grouper FROM table ) dlo ) lo, table t WHERE t.grouper = lo.grouper AND t.val > lo.mid 

    Замените grouper именем столбца, который вы хотите группировать, и val с именем столбца, в котором хранятся значения.

    Чтобы выяснить, как именно он работает, шаг за шагом от самого внутреннего запроса и запускать их.

    Кроме того, есть небольшое упрощение – подзапрос, который находит mid может возвращать NULL, если определенная категория не имеет достаточных значений, поэтому должен быть COALESCE этого значения для некоторой константы, которая имела бы смысл в сравнении (в вашем случае это будет MIN домена val, в статье это MAX).

    EDIT2: Я забыл упомянуть, что именно LIMIT 2,1 определяет n (LIMIT n, 1).

    Если вы используете mySQl, почему бы вам не использовать функциональность LIMIT? Сортируйте записи в порядке убывания и ограничивайте верхние n, т. Е.

     SELECT yourColumnName FROM yourTableName ORDER BY Id desc LIMIT 0,3 

    Вот как я получаю N max строк для каждой группы в MySQL

     SELECT co.id, co.person, co.country FROM person co WHERE ( SELECT COUNT(*) FROM person ci WHERE co.country = ci.country AND co.id < ci.id ) < 1 ; 

    как это работает:

    • присоединяться к столу
    • группы выполняются co.country = ci.country
    • N элементов на группу контролируются ) < 1 поэтому для 3 элементов -) <3
    • для получения max или min зависит от: co.id < ci.id
      • co.id
      • co.id> ci.id - min

    Полный пример:

    mysql выбрать n максимальных значений для каждой группы /

    mysql select max и возвращает несколько значений

    Примечание. Имейте в виду, что дополнительные ограничения, такие как gender = 0, должны выполняться в обоих местах. Поэтому, если вы хотите получить только мужчин, тогда вы должны применить ограничение на внутренний и внешний выбор

    Начиная с MySQL 8.0/MariaDB поддерживаются оконные функции, которые предназначены для такого рода операций:

     SELECT * FROM (SELECT *,ROW_NUMBER() OVER(PARTITION BY column2 ORDER BY column1 DESC) AS r FROM tab) s WHERE r <= 2 ORDER BY column2 DESC, r DESC; 

    Демо-версия DB-Fiddle.com

    Давайте будем гением компьютера.