mysql выберите верхние n максимальные значения - PullRequest
14 голосов
/ 19 мая 2011

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

Для такой таблицы:

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

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

3    
4    
7    
8    

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

* * 1010

Возвращает:

4
8

Ответы [ 4 ]

5 голосов
/ 19 мая 2011

Для 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).

1 голос
/ 02 апреля 2018

Начиная с 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

1 голос
/ 17 ноября 2011

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

SELECT yourColumnName FROM yourTableName 
ORDER BY Id desc 
LIMIT 0,3 
0 голосов
/ 28 февраля 2018

Вот так я получаю 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 </li>
  • для получения максимума или минимума зависит от: co.id < ci.id
    • co.id
    • co.id> ci.id - мин.

Полный пример здесь:

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

mysql выбрать максимум и вернуть несколько значений

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

...