

Проще всего получить второе значение из этого набора результатов в приложении:
SELECT DISTINCT value FROM Table ORDER BY value DESC LIMIT 2
Но если вы должны выбрать второе значение с помощью SQL, как насчет:
SELECT MIN(value) FROM (SELECT DISTINCT value FROM Table ORDER BY value DESC LIMIT 2) AS t
Вы запускали это на SQL Server?
@Craig - LIMIT - это синтаксис MySql, вопрос не указывает версию SQL.
Я полагаю, вы можете сделать что-то вроде:
SELECT * FROM Table ORDER BY NumericalColumn DESC LIMIT 1 OFFSET 1
или же
SELECT * FROM Table ORDER BY NumericalColumn DESC LIMIT (1, 1)
в зависимости от вашего сервера базы данных. Подсказка: SQL Server не поддерживает LIMIT.
update - SQL Server 2012 добавил предложение смещения / выборки, аналогичное приведенному выше dbadiaries.com/…
Предположим, у вас есть 2 элемента с одинаковым значением, но также самый большой элемент. Думаю надо делать OFFSET 2
Добавление предложения GROUP BY устранит повторяющееся условие в этом случае.
SELECT MAX( col )
FROM table
WHERE col < ( SELECT MAX( col )
FROM table )
Ответ Мэтта и Виной также заботится о дубликатах. Предположим, что наибольшее значение повторяется, тогда использование ответа Мэтта даст правильное второе по величине значение, а если вы использовали подходы наверх 2 по убыванию и мин, вы можете вместо этого получить наибольшее значение.
Что, если есть несколько вторых по величине ... Тогда это не даст всех кортежей
спасибо, использовал это, чтобы найти второе последнее свидание здесь
Намного лучше, чем мой подход с использованием ORDER_BY и LIMIT для внутреннего оператора
Обратите внимание, что это не вернет результат, если нет записей перед запрошенной.
Работает как шарм!
select top 1 MyIntColumn from MyTable
where
MyIntColumn <> (select top 1 MyIntColumn from MyTable order by MyIntColumn desc)
order by MyIntColumn desc
Это работает в MS SQL:
select max([COLUMN_NAME]) from [TABLE_NAME] where [COLUMN_NAME] <
( select max([COLUMN_NAME]) from [TABLE_NAME] )
Что-то вроде этого? Однако я не тестировал это:
select top 1 x
from (
select top 2 distinct x
from y
order by x desc
) z
order by x
В T-Sql есть два способа:
--filter out the max
select max( col )
from [table]
where col < (
select max( col )
from [table] )
--sort top two then bottom one
select top 1 col
from (
select top 2 col
from [table]
order by col) topTwo
order by col desc
В Microsoft SQL первый способ в два раза быстрее второго, даже если рассматриваемый столбец кластеризован.
Это связано с тем, что операция сортировки выполняется относительно медленно по сравнению со сканированием таблицы или индекса, используемым агрегированием max.
В качестве альтернативы в Microsoft SQL 2005 и выше вы можете использовать функцию ROW_NUMBER():
select col
from (
select ROW_NUMBER() over (order by col asc) as 'rowNum', col
from [table] ) withRowNum
where rowNum = 2
См. Как выбрать n-ю строку в таблице базы данных SQL?.
Sybase SQL Anywhere поддерживает:
SELECT TOP 1 START AT 2 value from table ORDER BY value
Я вижу здесь как некоторые специфические для SQL Server, так и некоторые специфические для MySQL решения, поэтому вы можете уточнить, какая база данных вам нужна. Хотя, если бы мне пришлось угадывать, я бы сказал SQL Server, поскольку в MySQL это тривиально.
Я также вижу некоторые решения, которые не работают, потому что они не учитывают возможность дублирования, поэтому будьте осторожны, какие из них вы принимаете. Наконец, я вижу несколько из них, которые будут работать, но сделают два полных сканирования таблицы. Вы хотите убедиться, что второе сканирование рассматривает только 2 значения.
SQL Server (до 2012 г.):
SELECT MIN([column]) AS [column]
FROM (
SELECT TOP 2 [column]
FROM [Table]
GROUP BY [column]
ORDER BY [column] DESC
) a
MySQL:
SELECT `column`
FROM `table`
GROUP BY `column`
ORDER BY `column` DESC
LIMIT 1,1
Обновлять:
SQL Server 2012 теперь поддерживает гораздо более чистый (и стандарт) синтаксис OFFSET / FETCH:
SELECT TOP 2 [column]
FROM [Table]
GROUP BY [column]
ORDER BY [column] DESC
OFFSET 1 ROWS
FETCH NEXT 1 ROWS ONLY;
Это то, что я надеялся увидеть. Принятый ответ будет уродливым, если вам нужно, чтобы он работал с любым n. Этот выдерживает это испытание.
@RobinMaben Робин, как насчет сценария, когда повторяется наибольшее значение? Предположим, что столбец содержит числа от 1 до 100, но 100 повторяется дважды. Тогда это решение даст второе по величине значение 100, что будет неверным. Правильно?
@PankajSharma нет, это все равно будет работать из-за предложения GROUP BY
Это стандартный способ сделать это. Принятый ответ должен быть обновлен до этого.
Я получаю сообщение об ошибке, в котором говорится, что я не могу использовать TOP и OFFSET в одном запросе.
Неважно, все равно это сработало, решение SQL 2012, безусловно, лучшее, спасибо, что поделились!
select * from emp e where 3>=(select count(distinct salary)
from emp where s.salary<=salary)
Этот запрос выбирает максимум три зарплаты. Если два сотрудника получают одинаковую зарплату, это не влияет на запрос.
Используя коррелированный запрос:
Select * from x x1 where 1 = (select count(*) from x where x1.a < a)
Том, полагаю, это не удастся, если в разделе select max([COLUMN_NAME]) from [TABLE_NAME] будет возвращено более одного значения. т.е. если в наборе данных более двух значений.
Небольшая модификация вашего запроса будет работать -
select max([COLUMN_NAME]) from [TABLE_NAME] where [COLUMN_NAME] **IN**
( select max([COLUMN_NAME]) from [TABLE_NAME] )
select max(COL_NAME) from TABLE_NAME where COL_NAME in
(select COL_NAME from TABLE_NAME where COL_NAME < (select max(COL_NAME) from TABLE_NAME));
подзапрос возвращает все значения, кроме самого большого. выберите максимальное значение из возвращенного списка.
select min(sal) from emp where sal in
(select TOP 2 (sal) from emp order by sal desc)
Примечание
sal - это имя столбца
emp - имя таблицы
SELECT MAX(col) FROM table WHERE col NOT IN (SELECT MAX(col) FROM table);
select col_name
from (
select dense_rank() over (order by col_name desc) as 'rank', col_name
from table_name ) withrank
where rank = 2
select * from (select ROW_NUMBER() over (Order by Col_x desc) as Row, Col_1
from table_1)as table_new tn inner join table_1 t1
on tn.col_1 = t1.col_1
where row = 2
Надеюсь, это поможет получить значение для любой строки .....
SELECT
*
FROM
table
WHERE
column < (SELECT max(columnq) FROM table)
ORDER BY
column DESC LIMIT 1
Очень простой запрос для поиска второго по величине значения
SELECT `Column` FROM `Table` ORDER BY `Column` DESC LIMIT 1,1;
вы можете найти второе по величине значение столбца, используя следующий запрос
SELECT *
FROM TableName a
WHERE
2 = (SELECT count(DISTINCT(b.ColumnName))
FROM TableName b WHERE
a.ColumnName <= b.ColumnName);
вы можете найти более подробную информацию по следующей ссылке
http://www.abhishekbpatel.com/2012/12/how-to-get-nth-maximum-and-minimun.html
Архив неработающей ссылки: web.archive.org/web/20130406161645/http://…
Запрос на поиск второго по величине числа в строке -
select Top 1 (salary) from XYZ
where Salary not in (select distinct TOP 1(salary) from XYZ order by Salary desc)
ORDER BY Salary DESC
Изменяя выделенный Top 1 на TOP 2, 3 или 4, вы можете найти 3-е, 4-е и 5-е места соответственно.
Мы также можем использовать элементы order by и top 1 следующим образом:
Select top 1 col_name from table_name
where col_name < (Select top 1 col_name from table_name order by col_name desc)
order by col_name desc
SELECT * FROM EMP
WHERE salary=
(SELECT MAX(salary) FROM EMP
WHERE salary != (SELECT MAX(salary) FROM EMP)
);
Это еще один способ найти второе по величине значение столбца. Рассмотрим таблицу "Студент" и столбец "Возраст". Тогда запрос будет выглядеть так:
select top 1 Age from Student where Age in(select distinct top 2 Age from Student order by Age desc) order by Age asc
Самый простой способ:
SELECT
Column name
FROM
Table name
ORDER BY
Column name DESC
LIMIT 1,1
Пытаться:
select a.* ,b.* from
(select * from (select ROW_NUMBER() OVER(ORDER BY fc_amount desc) SrNo1, fc_amount as amount1 From entry group by fc_amount) tbl where tbl.SrNo1 = 2) a
,
(select * from (select ROW_NUMBER() OVER(ORDER BY fc_amount asc) SrNo2, fc_amount as amount2 From entry group by fc_amount) tbl where tbl.SrNo2 =2) b
select * from [table] where (column)=(select max(column)from [table] where column < (select max(column)from [table]))
Используйте этот запрос.
SELECT MAX( colname )
FROM Tablename
where colname < (
SELECT MAX( colname )
FROM Tablename)
Этот ответ идентичен ответу @Matt Rogish, который был опубликован 6 лет назад и уже давно отмечен как правильный. Этот ответ ничего не добавляет, и его следует удалить.
select MAX(salary) as SecondMax from test where salary !=(select MAX(salary) from test)
select age from student group by id having age<(select max(age) from student)order by age limit 1
SELECT MAX(Salary) FROM Employee WHERE Salary NOT IN (SELECT MAX(Salary) FROM Employee )
Этот запрос вернет максимальную зарплату из результата, который не содержит максимальную зарплату из общей таблицы.
Можете ли вы редактировать объяснить, чем это значительно отличается от старых ответов?
Самый простой из всех
select sal from salary order by sal desc limit 1 offset 1
select score
from table
where score = (select max(score)-1 from table)
Microsoft SQL Server - использование двух вершин для N-го наивысшего значения (подзапрос с псевдонимом).
Чтобы решить для 2-го по величине:
SELECT TOP 1 q.*
FROM (SELECT TOP 2 column_name FROM table_name ORDER BY column_name DESC) as q
ORDER BY column_name ASC;
Использует TOP дважды, но требует подзапроса с псевдонимом. По сути, внутренний запрос принимает 2 наибольших значения в порядке убывания, затем внешний запрос переворачивается в порядке возрастания, так что второе наибольшее значение теперь находится наверху. Оператор SELECT возвращает эту вершину.
Чтобы найти n-е наивысшее значение, измените значение TOP подзапроса. Например:
SELECT TOP 1 q.*
FROM (SELECT TOP 5 column_name FROM table_name ORDER BY column_name DESC) as q
ORDER BY column_name;
Вернет пятое по величине значение.
Старый вопрос, который я знаю, но это дало мне лучший план выполнения:
SELECT TOP 1 LEAD(MAX (column)) OVER (ORDER BY column desc)
FROM TABLE
GROUP BY column
select extension from [dbo].[Employees] order by extension desc offset 2 rows fetch next 1 rows only
Пожалуйста, опишите подробнее свой ответ, так как этот пост был найден в посте низкого качества. Только код и ответы «попробуйте это» не приветствуются, поскольку они не предоставляют никакого контента для поиска и почему люди должны «попробовать это».
Как вы упомянули, повторяющиеся значения. В таком случае вы можете использовать ОТЧЕТЛИВЫЙ и ГРУППА ПО, чтобы узнать второе по величине значение.
Вот таблица
salary
:
GROUP BY
SELECT amount FROM salary
GROUP by amount
ORDER BY amount DESC
LIMIT 1 , 1
DISTINCT
SELECT DISTINCT amount
FROM salary
ORDER BY amount DESC
LIMIT 1 , 1
Первая часть LIMIT = начальный индекс
Вторая часть LIMIT = сколько значений
SELECT MAX(sal) FROM emp
WHERE sal NOT IN (SELECT top 3 sal FROM emp order by sal desc )
это вернет третью по величине sal of emp table
Очень просто. Особое ключевое слово также позаботится о дубликатах.
SELECT distinct SupplierID FROM [Products] order by SupplierID desc limit 1 offset 1
Самый простой способ получить вторую последнюю строку из таблицы SQL - использовать ORDER BYColumnNameDESC и установить LIMIT 1,1.
Попробуй это:
SELECT * from `TableName` ORDER BY `ColumnName` DESC LIMIT 1,1
Кажется, это повторение некоторых из существующих ответов.
Это очень простой код, вы можете попробовать это: -
бывший : Имя таблицы = тест
salary
1000
1500
1450
7500
Код MSSQL для получения 2-го по величине значения
select salary from test order by salary desc offset 1 rows fetch next 1 rows only;
здесь «смещение 1 строки» означает вторую строку таблицы, а «выборка только следующих 1 строк» предназначена для отображения только этой 1 строки. если вы не используете «выбрать только следующую 1 строку», тогда будут показаны все строки из второй строки.
Самый оптимизированный и удобный для ресурсов ответ. Я сэкономил довольно много времени, используя его в своем подзапросе. Спасибо.
MSSQL
SELECT *
FROM [Users]
order by UserId desc OFFSET 1 ROW
FETCH NEXT 1 ROW ONLY;
MySQL
SELECT *
FROM Users
order by UserId desc LIMIT 1 OFFSET 1
Нет необходимости в подзапросах ... просто пропустите одну строку и выберите вторую строку после порядка по убыванию
SELECT * FROM `employee` WHERE employee_salary = (SELECT employee_salary
FROM`employee` GROUP BY employee_salary ORDER BY employee_salary DESC LIMIT
1,1)
select max(column_name) from table_name
where column_name not in (select max(column_name) from table_name);
не в - это условие, исключающее наивысшее значение column_name.
Ссылка: программист интервью
Вы можете найти n-е наибольшее значение, используя следующий запрос.
select top 1 UnitPrice from (select distinct top n UnitPrice from
[Order Details] order by UnitPrice desc) as Result order by UnitPrice asc
Здесь значение n будет 1 (для наибольшего числа), 2 (для второго наибольшего числа), 3 (для третьего наибольшего числа) ...
Сначала создайте фиктивную таблицу без максимальной заработной платы, затем запросите максимальное значение из фиктивной таблицы
SELECT max(salary) from (Select * FROM emp WHERE salary<> (SELECT MAX(salary) from emp)) temp
используйте смещение для этой цели ... выберите расширение из [dbo]. [Сотрудники] упорядочить по расширению desc смещение 2 строки получить только следующие 1 строку