Запрос на поиск максимального значения столбца nᵗʰ

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

слишком общий думаю: укажите хотя бы на какой СУБД ...

ila 17.09.2008 11:14

Какая база данных? Я не думаю, что есть очень хорошее "общее" решение этой проблемы.

Matthew Watson 17.09.2008 11:12
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
31
2
99 726
28
Перейти к ответу Данный вопрос помечен как решенный

Ответы 28

Ответ принят как подходящий

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

Обновлено::

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

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

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

Не могли бы вы предоставить фрагмент кода? Я попробовал ваше предложение, но мне не удалось получить значение из n-й строки.

user379888 19.09.2011 14:21

Использование ROWID не является ни безопасным, ни практичным делом. Возьмем случай sqlite. ROWID может или не может быть сгенерирован серийно. Более того, порядок ROWID может не совпадать с порядком запрошенного столбца.

Quirk 15.04.2016 22:12

Это будет медленным, так как сначала потребуется упорядочить всю таблицу, а затем выбрать n-ю строку. Некоторые базы данных теперь предоставляют эту функцию, см. Ниже ответы, например, от Питера и Стивена Дикинсона.

kentsurrey 29.05.2020 19:04

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

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

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

Если вы используете mysql, это не будет работать в oracle (или, как мне кажется, mssql)

Matthew Watson 17.09.2008 11:16

В SQL Server просто выполните:

select distinct top n+1 column from table order by column desc

А потом выбросьте первое значение, если оно вам не нужно.

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

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

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

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

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 | 
+------+

Вот метод для 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 в самый внутренний блок запроса.

для SQL 2005:

SELECT col1 from 
     (select col1, dense_rank(col1) over (order by col1 desc) ranking 
     from t1) subq where ranking between 2 and @n

Еще один для Oracle с использованием аналитических функций:

select distinct col1 --distinct is required to remove matching value of column
from 
( select col1, dense_rank() over (order by col1 desc) rnk
  from tbl
)
where rnk = :b1

Просто откопал этот вопрос, когда искал ответ сам, и, похоже, это работает для 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....

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

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

Следующий запрос вернет N-й максимальный элемент.

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 |
+------+

Простое решение, работающее со всеми базами данных! Хорошая мысль! :)

Sterex 25.07.2012 11:40

Отличный ответ! Я сталкивался с этой проблемой раньше и беспокоился о том, как ее решить, не привязываясь к конкретному поставщику :) Один из возможных недостатков заключается в том, что он выполняет подзапрос для каждой строки.

gaboroncancio 20.03.2015 19:36

Это круто! Я использую его с оператором >=, чтобы получить все строки до N-й позиции. Я хотел бы добавить к нему рейтинг, например, «1» для максимального значения, «2» для второго максимального значения и т. д. Вы знаете, как это сделать?

NurShomik 21.10.2016 17:25

@NurShomik, если вам нужна универсальная функция для ранга, см. Это: stackoverflow.com/a/3333697/1385252

dexter 22.10.2016 11:28

пожалуйста, объясни. Я не могу понять, как нам помогает сравнение.

Usman 17.05.2018 09:51

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

Achy97 12.06.2019 11:37

Как вы справляетесь с тем, что подзапрос возвращает более 1 строки для N = 4?

Elliott de Launay 09.04.2020 04:09

Модификация на Select DISTINCT SAL from EMPLOYEE E1 where .... работала

Elliott de Launay 09.04.2020 05:23

select sal,ename from emp e where
 2=(select count(distinct sal) from emp  where e.sal<=emp.sal) or
 3=(select count(distinct sal) from emp  where e.sal<=emp.sal) or
 4=(select count(distinct sal) from emp  where e.sal<=emp.sal) order by sal desc;

Select max(sal) 
from table t1 
where N (select max(sal) 
        from table t2 
        where t2.sal > t1.sal)

Чтобы найти N макс.

SELECT * FROM tablename 
WHERE columnname<(select max(columnname) from tablename) 
order by columnname desc limit 1

MySQL:

select distinct(salary) from employee order by salary desc limit (n-1), 1;

Стол служащий

salary 
1256
1256
2563
8546
5645

Вы найдете второе максимальное значение по этому запросу

select salary 
from employee 
where salary=(select max(salary) 
                from employee 
                where salary <(select max(salary) from employee));

Вы найдете третье максимальное значение по этому запросу

select salary 
from employee 
where salary=(select max(salary) 
                from employee 
                where salary <(select max(salary) 
                                from employee 
                                where salary <(select max(salary)from employee)));

Самые внешние выборы являются посторонними. Остановка на первом максимуме (зарплата) сработала бы.

RichardTheKiwi 29.09.2012 15:44

Это решение безумное.

Henry Lin 21.08.2017 07:35

Отвечать : верхняя секунда:

select * from (select * from deletetable   where rownum <=2 order by rownum desc) where rownum <=1

Когда вы не добавляете что-то новое, не отвечайте на вопросы 4-летней давности :)

fancyPants 25.09.2012 12:43

(Название таблицы = учащийся, название столбца = отметка)

select * from(select row_number() over (order by mark desc) as t,mark from student group by mark) as td where t=4

MS SQL Server row_number

woodvi 13.07.2015 22:55

(TableName = Student, ColumnName = Mark):

select *
from student 
where mark=(select mark 
            from(select row_number() over (order by mark desc) as t,
                 mark 
                 from student group by mark) as td 
            where t=2)

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

SELECT * FROM TableName a WHERE
    n = (SELECT count(DISTINCT(b.ColumnName)) 
    FROM TableName b WHERE a.ColumnName <=b.ColumnName);

Я думаю, что приведенный ниже запрос будет отлично работать на oracle sql ... Я сам это тестировал ..

Информация, связанная с этим запросом: в этом запросе используются две таблицы с именами employee и department со столбцами в названии сотрудника: name (имя сотрудника), dept_id (общее для сотрудника и отдела), salary

И столбцы в таблице отделов: dept_id (также общий для таблицы сотрудников), dept_name

SELECT
  tab.dept_name,MIN(tab.salary) AS Second_Max_Sal FROM (
    SELECT e.name, e.salary, d.dept_name, dense_rank() over (partition BY  d.dept_name          ORDER BY e.salary)  AS   rank FROM department d JOIN employee e USING (dept_id) )  tab
 WHERE
   rank  BETWEEN 1 AND 2
 GROUP BY
   tab.dept_name

Благодарность

Select min(fee) 
from fl_FLFee 
where fee in (Select top 4 Fee from fl_FLFee order by 1 desc)

Измените номер четыре с помощью N.

Вы можете упростить вот так

SELECT MIN(Sal) FROM TableName
WHERE Sal IN
(SELECT TOP 4 Sal FROM TableName ORDER BY Sal DESC)

Если Sal содержит повторяющиеся значения, используйте это

SELECT MIN(Sal) FROM TableName
WHERE Sal IN
(SELECT distinct TOP 4 Sal FROM TableName ORDER BY Sal DESC)

4 будет n-м значением, это может быть любое наивысшее значение, такое как 5 или 6 и т. д.

Это запрос для получения n-го по величине из столбца out n = 0 для второго по величине и n = 1 для 3-го по величине и так далее ...

 SELECT * FROM TableName
 WHERE ColomnName<(select max(ColomnName) from TableName)-n order by ColomnName desc limit 1;

Простой SQL-запрос для получения сведений о сотруднике, у которого N-й MAX Salary в таблице Employee.

sql> select * from Employee order by salary desc LIMIT 1 OFFSET <N - 1>;

Рассмотрим структуру таблицы как:

Employee ( id [int primary key auto_increment], name [varchar(30)], salary [int] );

Пример:

Если вам нужна 3-я зарплата MAX в приведенной выше таблице, тогда запрос будет:

sql> select * from Employee order by salary desc LIMIT 1 OFFSET 2;

По аналогии:

Если вам нужна 8-я зарплата MAX в приведенной выше таблице, тогда запрос будет:

sql> select * from Employee order by salary desc LIMIT 1 OFFSET 7;

NOTE: When you have to get the NthMAX value you should give the OFFSET as (N - 1).

Таким же образом вы можете проделать такую ​​же операцию с зарплатой в порядке возрастания.

select column_name from table_name 
order by column_name desc limit n-1,1;

где n = 1, 2, 3, .... n-е максимальное значение.

В PostgreSQL найти N-ю наибольшую зарплату из таблицы сотрудников.

SELECT * FROM Employee WHERE salary in 
(SELECT salary FROM Employee ORDER BY salary DESC LIMIT N) 
ORDER BY salary ASC LIMIT 1;

запрос mysql: Предположим, я хочу узнать n-ю таблицу сотрудников формы максимальной заработной платы

select salary 
form employee
order by salary desc
limit n-1,1 ;

Решение для поиска N-го максимального значения определенного столбца в SQL Server:

Таблица сотрудников:

Employee Table

Таблица продаж:

Sales Table

Данные таблицы сотрудников:

==========
Id  name
=========
6   ARSHAD M
7   Manu
8   Shaji

Данные таблицы продаж:

=================
id  emp_id   amount
=================
1   6        500
2   7        100
3   8        100
4   6        150
5   7        130
6   7        130
7   7        330

Запрос, чтобы узнать подробности о сотруднике, имеющем наивысшие продажи / Nth наивысший продавец

select * from (select E.Id,E.name,SUM(S.amount) AS 'total_amount' from employee E INNER JOIN Sale S on E.Id=S.emp_id group by S.emp_id,E.Id,E.name ) AS T1 WHERE(0)=( select COUNT(DISTINCT(total_amount)) from(select E.Id,E.name,SUM(S.amount) AS 'total_amount' from employee E INNER JOIN Sale S on E.Id=S.emp_id group by S.emp_id,E.Id,E.name )AS T2 WHERE(T1.total_amount<T2.total_amount) );

В ГДЕ (0) заменить 0 на n-1

Результат:

========================
id  name    total_amount
========================
7   Manu    690

Другие вопросы по теме