Каков самый простой SQL-запрос для поиска второго по величине целочисленного значения в определенном столбце?
В столбце могут быть повторяющиеся значения.
Каков самый простой SQL-запрос для поиска второго по величине целочисленного значения в определенном столбце?
В столбце могут быть повторяющиеся значения.
SELECT MAX( col )
FROM table
WHERE col < ( SELECT MAX( col )
FROM table )
SELECT MAX(col) FROM table WHERE col NOT IN (SELECT MAX(col) FROM table);
В 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
Я вижу как некоторые специфичные для 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;
Я полагаю, вы можете сделать что-то вроде:
SELECT * FROM Table ORDER BY NumericalColumn DESC LIMIT 1 OFFSET 1
или
SELECT * FROM Table ORDER BY NumericalColumn DESC LIMIT (1, 1)
в зависимости от вашего сервера базы данных. Подсказка: SQL Server не делает LIMIT.
вы можете найти второе по величине значение столбца, используя следующий запрос
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 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 `Column` FROM `Table` ORDER BY `Column` DESC LIMIT 1,1;
SELECT MAX(Salary) FROM Employee WHERE Salary NOT IN (SELECT MAX(Salary) FROM Employee )
Этот запрос вернет максимальную зарплату из результата - который не содержит максимальную зарплату из общей таблицы.
Старый вопрос, который я знаю, но это дало мне лучший план exec:
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 sal from salary order by sal desc limit 1 offset 1
Это очень простой код, вы можете попробовать это: -
пример: имя таблицы = тест
salary
1000
1500
1450
7500
Код MSSQL для получения второго по величине значения
select salary from test order by salary desc offset 1 rows fetch next 1 rows only;
здесь 'смещение 1 строки' означает 2-ю строку таблицы, а 'выборка только для следующих 1 строки' - для показа только этой 1 строки. если вы не используете "извлечь только следующие 1 строки", тогда будут показаны все строки из второй строки.
Том, полагайте, что это не удастся, если в разделе select max([COLUMN_NAME]) from [TABLE_NAME]
есть более одного значения. то есть, когда в наборе данных имеется более 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));
subquery возвращает все значения, отличные от самого большого. выберите максимальное значение из возвращенного списка.
select min(sal) from emp where sal in
(select TOP 2 (sal) from emp order by sal desc)
Примечание
sal - имя col
emp - имя таблицы
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
table
WHERE
column < (SELECT max(columnq) FROM table)
ORDER BY
column DESC LIMIT 1
Это самый лучший способ:
SELECT
Column name
FROM
Table name
ORDER BY
Column name DESC
LIMIT 1,1
select age from student group by id having age<(select max(age) from student)order by age limit 1
Как вы упомянули дублирующие значения. В этом случае вы можете использовать DISTINCT и GROUP BY, чтобы узнать второе наивысшее значение
Вот таблица
зарплата
:
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 )
это вернет третью самую высокую сумму таблицы emp
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 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
См. Как выбрать n-я строка в таблице базы данных SQL?.
Sybase SQL Anywhere поддерживает:
SELECT TOP 1 START AT 2 value from table ORDER BY value
select * from emp e where 3>=(select count(distinct salary)
from emp where s.salary<=salary)
Этот запрос выбирает максимум три зарплаты. Если две emp получают одинаковую зарплату, это не влияет на запрос.
Использование коррелированного запроса:
Select * from x x1 where 1 = (select count(*) from x where x1.a < a)
Запрос, чтобы найти второе наибольшее число в строке -
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.