

Вы можете отсортировать столбец по убыванию, а затем просто получить значение из n-й строки.
Обновлено::
Обновлено согласно запросу на комментарий. ПРЕДУПРЕЖДЕНИЕ полностью не тестировал!
SELECT DOB FROM (SELECT DOB FROM USERS ORDER BY DOB DESC) WHERE ROWID = 6
Что-то вроде вышеперечисленного должно сработать для Oracle ... возможно, вам сначала придется разобраться с синтаксисом!
Не могли бы вы предоставить фрагмент кода? Я попробовал ваше предложение, но мне не удалось получить значение из n-й строки.
Использование ROWID не является ни безопасным, ни практичным делом. Возьмем случай sqlite. ROWID может или не может быть сгенерирован серийно. Более того, порядок ROWID может не совпадать с порядком запрошенного столбца.
Это будет медленным, так как сначала потребуется упорядочить всю таблицу, а затем выбрать n-ю строку. Некоторые базы данных теперь предоставляют эту функцию, см. Ниже ответы, например, от Питера и Стивена Дикинсона.
Вы не указали, какую базу данных в MySQL вы можете сделать
SELECT column FROM table ORDER BY column DESC LIMIT 7,10;
Пропустил бы первые 7, а затем получил бы следующую десятку наивысшего.
Если вы используете mysql, это не будет работать в oracle (или, как мне кажется, mssql)
В 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 | +------+
Простое решение, работающее со всеми базами данных! Хорошая мысль! :)
Отличный ответ! Я сталкивался с этой проблемой раньше и беспокоился о том, как ее решить, не привязываясь к конкретному поставщику :) Один из возможных недостатков заключается в том, что он выполняет подзапрос для каждой строки.
Это круто! Я использую его с оператором >=, чтобы получить все строки до N-й позиции. Я хотел бы добавить к нему рейтинг, например, «1» для максимального значения, «2» для второго максимального значения и т. д. Вы знаете, как это сделать?
@NurShomik, если вам нужна универсальная функция для ранга, см. Это: stackoverflow.com/a/3333697/1385252
пожалуйста, объясни. Я не могу понять, как нам помогает сравнение.
это было здорово, но было бы лучше, если бы вы могли объяснить, как он выполняется
Как вы справляетесь с тем, что подзапрос возвращает более 1 строки для N = 4?
Модификация на Select DISTINCT SAL from EMPLOYEE E1 where .... работала
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)));
Самые внешние выборы являются посторонними. Остановка на первом максимуме (зарплата) сработала бы.
Это решение безумное.
Отвечать : верхняя секунда:
select * from (select * from deletetable where rownum <=2 order by rownum desc) where rownum <=1
Когда вы не добавляете что-то новое, не отвечайте на вопросы 4-летней давности :)
(Название таблицы = учащийся, название столбца = отметка)
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
(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 Nth
MAXvalue you should give theOFFSETas (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:
Таблица сотрудников:

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

Данные таблицы сотрудников:
==========
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
слишком общий думаю: укажите хотя бы на какой СУБД ...