Запрос для поиска n-го максимального значения столбца - PullRequest
24 голосов
/ 17 сентября 2008

Я хочу найти 2-е, 3-е ... максимальное значение столбца

Ответы [ 28 ]

29 голосов
/ 15 апреля 2009

Рассмотрим следующую таблицу Employee с одним столбцом для зарплаты.

+------+
| Sal  |
+------+
| 3500 | 
| 2500 | 
| 2500 | 
| 5500 |
| 7500 |
+------+

Следующий запрос вернет элемент Nth Maximum.

select SAL from EMPLOYEE E1 where 
 (N - 1) = (select count(distinct(SAL)) 
            from EMPLOYEE E2 
            where E2.SAL > E1.SAL )

Например, когда требуется второе максимальное значение,

  select SAL from EMPLOYEE E1 where 
     (2 - 1) = (select count(distinct(SAL)) 
                from EMPLOYEE E2 
                where E2.SAL > E1.SAL )
+------+
| Sal  |
+------+
| 5500 |
+------+
11 голосов
/ 17 сентября 2008

Вы можете отсортировать столбец по убыванию, а затем просто получить значение из n-й строки.

EDIT ::

Обновлено согласно запросу комментария. ПРЕДУПРЕЖДЕНИЕ полностью не проверено!

SELECT DOB FROM (SELECT DOB FROM USERS ORDER BY DOB DESC) WHERE ROWID = 6

Что-то похожее на вышеприведенное должно работать для Oracle ... вам, возможно, придется сначала получить правильный синтаксис!

8 голосов
/ 17 сентября 2008

Вы не указали, какую базу данных, на MySQL вы можете сделать

SELECT column FROM table ORDER BY column DESC LIMIT 7,10;

Пропустил бы первые 7, а затем получил бы следующие десять самых высоких.

6 голосов
/ 17 сентября 2008

Опять же, вам может потребоваться исправить для вашей базы данных, но если вы хотите, чтобы верхнее 2-е значение в наборе данных, которое потенциально имеет дублированное значение, вам также понадобится создать группу:

SELECT column 
FROM table 
WHERE column IS NOT NULL 
GROUP BY column 
ORDER BY column DESC 
LIMIT 5 OFFSET 2;

Пропустит первые два, а затем получит следующие пять самых высоких.

5 голосов
/ 17 сентября 2008

Чистый SQL (примечание: я бы порекомендовал использовать функции SQL, специфичные для вашей СУБД, поскольку она, вероятно, будет более эффективной). Это даст вам n + 1-е наибольшее значение (чтобы получить наименьшее, переверните <). Если у вас есть дубликаты, сделайте это COUNT (DISTINCT VALUE) .. </p>

select id from table order by id desc limit 4 ;
+------+
| id   |
+------+
| 2211 | 
| 2210 | 
| 2209 | 
| 2208 | 
+------+


SELECT yourvalue
  FROM yourtable t1
 WHERE EXISTS( SELECT COUNT(*)
                 FROM yourtable t2
                WHERE t1.id       <> t2.id
                  AND t1.yourvalue < t2.yourvalue
               HAVING COUNT(*) = 3 )


+------+
| id   |
+------+
| 2208 | 
+------+
3 голосов
/ 20 ноября 2012

(Имя таблицы = Студент, Имя столбца = оценка)

select * from(select row_number() over (order by mark desc) as t,mark from student group by mark) as td where t=4
2 голосов
/ 23 января 2013

Вы можете найти n-е наибольшее значение столбца, используя следующий запрос:

SELECT * FROM TableName a WHERE
    n = (SELECT count(DISTINCT(b.ColumnName)) 
    FROM TableName b WHERE a.ColumnName <=b.ColumnName);
1 голос
/ 09 апреля 2009

Просто выкопал этот вопрос, когда искал ответ сам, и похоже, что это работает для SQL Server 2005 (получено из решения Blorgbeard ):

SELECT MIN(q.col1) FROM (
    SELECT
        DISTINCT TOP n col1
        FROM myTable
        ORDER BY col1 DESC
) q;

По сути, это SELECT MIN(q.someCol) FROM someTable q с верхним n таблицы, полученной запросом SELECT DISTINCT....

1 голос
/ 17 сентября 2008

Вот метод для Oracle. Этот пример получает 9-е самое высокое значение. Просто замените 9 на переменную связывания, содержащую позицию, которую вы ищете.

   select created from (
     select created from (
       select created from user_objects
         order by created desc
       )
       where rownum <= 9
       order by created asc
     )
     where rownum = 1

Если бы вы хотели n-е уникальное значение, вы бы добавили DISTINCT в самый внутренний блок запроса.

1 голос
/ 15 ноября 2010
SELECT * FROM tablename 
WHERE columnname<(select max(columnname) from tablename) 
order by columnname desc limit 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...