Каков самый простой SQL-запрос, чтобы найти второе по величине значение?

Каков самый простой SQL-запрос для поиска второго по величине целочисленного значения в определенном столбце?

В столбце могут быть повторяющиеся значения.

4b9b3361
SELECT MAX( col )
  FROM table
 WHERE col < ( SELECT MAX( col )
                 FROM table )
213
ответ дан 28 авг. '08 в 15:43
источник
SELECT MAX(col) FROM table WHERE col NOT IN (SELECT MAX(col) FROM table);
48
ответ дан 09 сент. '11 в 16:13
источник

В 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
27
ответ дан 28 авг. '08 в 16:19
источник

Я вижу как некоторые специфические 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

Update:

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;
14
ответ дан 28 авг. '08 в 17:24
источник

Я полагаю, вы можете сделать что-то вроде:

SELECT * FROM Table ORDER BY NumericalColumn DESC LIMIT 1 OFFSET 1

или

SELECT * FROM Table ORDER BY NumericalColumn DESC LIMIT (1, 1)

в зависимости от вашего сервера базы данных. Подсказка: SQL Server не делает LIMIT.

10
ответ дан 28 авг. '08 в 15:43
источник

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

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

5
ответ дан 23 янв. '13 в 9:15
источник

Проще всего было бы получить второе значение из этого набора результатов в приложении:

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
5
ответ дан 28 авг. '08 в 15:42
источник

Очень простой запрос для поиска второго по величине значения

SELECT `Column` FROM `Table` ORDER BY `Column` DESC LIMIT 1,1;
3
ответ дан 25 окт. '12 в 14:01
источник
SELECT MAX(Salary) FROM Employee WHERE Salary NOT IN (SELECT MAX(Salary) FROM Employee )

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

3
ответ дан 09 мая '15 в 5:40
источник

Старый вопрос, который я знаю, но это дало мне лучший план exec:

 SELECT TOP 1 LEAD(MAX (column)) OVER (ORDER BY column desc)
 FROM TABLE 
 GROUP BY column
2
ответ дан 29 июля '16 в 21:52
источник

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

Надеемся на эту помощь, чтобы получить значение для любой строки.....

2
ответ дан 27 июня '12 в 22:04
источник

Том, полагайте, что это не удастся, если в разделе 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] )
1
ответ дан 25 нояб. '10 в 19:53
источник
select min(sal) from emp where sal in 
    (select TOP 2 (sal) from emp order by sal desc)

Примечание

sal - имя col

emp - имя таблицы

1
ответ дан 06 авг. '11 в 16:17
источник
select col_name
from (
    select dense_rank() over (order by col_name desc) as 'rank', col_name
    from table_name ) withrank 
where rank = 2
1
ответ дан 30 марта '12 в 11:40
источник

Как вы упомянули дублирующие значения. В этом случае вы можете использовать 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 = сколько значений

1
ответ дан 06 дек. '16 в 19:03
источник
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 возвращает все значения, отличные от самого большого. выберите максимальное значение из возвращенного списка.

1
ответ дан 25 нояб. '10 в 19:58
источник

Microsoft SQL Server - использование двух TOP-адресов для 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;

Вернет 5-е наивысшее значение.

0
ответ дан 23 мая '16 в 23:11
источник

Очень просто. Различное ключевое слово позаботится и о дубликатах.

SELECT distinct SupplierID FROM [Products] order by SupplierID desc limit 1 offset 1
0
ответ дан 17 апр. '17 в 16:42
источник

Это очень простой код, вы можете попробовать следующее: -

ex: Имя таблицы = тест

зарплата

1000 1500 1450 7500

Код MSSQL для получения 2-го наибольшего значения

выберите зарплату из тестового заказа по зарплате desc offset 1 rows fetch только следующие 1 строки;

здесь "смещение 1 строки" означает вторую строку таблицы и "выборка только для следующих 1 строк" ​​- это только одна строка. если вы не используете "выборка только по 1 строке", тогда он отображает все строки из второй строки.

0
ответ дан 23 июня '17 в 10:46
источник

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

Нет необходимости в подзапросах... просто пропустите одну строку и выберите вторую строку после заказа по убыванию

0
ответ дан 12 июля '17 в 8:34
источник

Что-то вроде этого? Я не тестировал его, но:

select top 1 x
from (
  select top 2 distinct x 
  from y 
  order by x desc
) z
order by x
0
ответ дан 28 авг. '08 в 15:45
источник
select * from emp e where 3>=(select count(distinct salary)
    from emp where s.salary<=salary)

Этот запрос выбирает максимум три зарплаты. Если две emp получают одинаковую зарплату, это не влияет на запрос.

0
ответ дан 09 июля '09 в 8:03
источник

Запрос, чтобы найти второе наибольшее число в строке -

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.

0
ответ дан 25 марта '13 в 9:37
источник

Это еще один способ найти второе по величине значение столбца. Рассмотрим таблицу "Студент" и столбец "Возраст". Затем запрос

select top 1 Age from Student where Age in(select distinct top 2 Age  from Student order by Age desc) order by Age asc
0
ответ дан 15 авг. '13 в 11:07
источник