30 ответов:
в 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 и выше вы можете использовать :
select col from ( select ROW_NUMBER() over (order by col asc) as 'rowNum', col from [table] ) withRowNum where rowNum = 2
Я вижу здесь как некоторые специфические для SQL Server, так и некоторые специфические для MySQL решения, поэтому вы можете уточнить, какая база данных вам нужна. Хотя, если бы мне пришлось угадать, я бы сказал SQL Server, так как это тривиально в MySQL.
Я также вижу некоторые решения, которые не будут работать, потому что они не учитывают возможность дублирования, поэтому будьте осторожны, какие из них вы принимаете. Наконец, я вижу несколько, которые будут работать, но это сделает два полных сканирования таблицы. Вы хотите убедиться, что 2-е сканирование только смотрит на 2 значения.
SQL Server (до 2012 года):
SELECT MIN([column]) AS [column] FROM ( SELECT TOP 2 [column] FROM [Table] GROUP BY [column] ORDER BY [column] DESC ) aMySQL:
SELECT `column` FROM `table` GROUP BY `column` ORDER BY `column` DESC LIMIT 1,1обновление:
среда SQL Server 2012 теперь поддерживает гораздо чище (и стандартный) синтаксис смещения/выборки:
SELECT TOP 2 [column] FROM [Table] GROUP BY [column] ORDER BY [column] DESC OFFSET 1 ROWS FETCH NEXT 1 ROWS ONLY;
Я полагаю, что вы можете сделать что-то вроде:
SELECT * FROM Table ORDER BY NumericalColumn DESC LIMIT 1 OFFSET 1или
SELECT * FROM Table ORDER BY NumericalColumn DESC LIMIT (1, 1)в зависимости от вашего сервера базы данных. Подсказка: SQL Server не ограничивает.
проще всего было бы получить второе значение из этого результирующего набора в приложении:
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
вы можете найти второе по величине значение в столбце, используя следующий запрос
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
очень простой запрос, чтобы найти второе по величине значение
SELECT `Column` FROM `Table` ORDER BY `Column` DESC LIMIT 1,1;
SELECT MAX(Salary) FROM Employee WHERE Salary NOT IN (SELECT MAX(Salary) FROM Employee )этот запрос вернет максимальную зарплату, из результата-который не содержит максимальную зарплату из общей таблицы.
старый вопрос я знаю, но это дало мне лучший план старпома:
SELECT TOP 1 LEAD(MAX (column)) OVER (ORDER BY column desc) FROM TABLE GROUP BY column
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 min(sal) from emp where sal in (select TOP 2 (sal) from emp order by sal desc)Примечание
sal - это имя col
ЕМП-это имя таблицы
том, считаю, что это не удастся, когда есть более одного значения, возвращаемого в . т. е. там, где в наборе данных больше 2 значений.
небольшая модификация вашего запроса будет работать -
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 col_name from ( select dense_rank() over (order by col_name desc) as 'rank', col_name from table_name ) withrank where rank = 2
Как вы упомянули повторяющиеся значения . В таком случае вы можете использовать DISTINCT и ГРУППЫ ПО чтобы узнать второе по величине значение
таблица
зарплата
:
ГРУППЫ ПО
SELECT amount FROM salary GROUP by amount ORDER BY amount DESC LIMIT 1 , 1DISTINCT
SELECT DISTINCT amount FROM salary ORDER BY amount DESC LIMIT 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 top 1 x from ( select top 2 distinct x from y order by x desc ) z order by x
посмотреть Как выбрать N-ю строку в таблице базы данных SQL?.
Sybase SQL Anywhere поддерживает:
SELECT TOP 1 START AT 2 value from table ORDER BY value
используя коррелированный запрос:
Select * from x x1 where 1 = (select count(*) from x where x1.a < a)
select * from emp e where 3>=(select count(distinct salary) from emp where s.salary<=salary)этот запрос выбирает максимум три зарплаты. Если два emp получают одинаковую зарплату, это не влияет на запрос.
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] )
запрос, чтобы найти 2-й самый высокий номер в строке -
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 1toTOP 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

Comments