Какой самый простой SQL-запрос для поиска второго по величине значения? - PullRequest
145 голосов
/ 28 августа 2008

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

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

Ответы [ 46 ]

268 голосов
/ 28 августа 2008
SELECT MAX( col )
  FROM table
 WHERE col < ( SELECT MAX( col )
                 FROM table )
58 голосов
/ 09 сентября 2011
SELECT MAX(col) FROM table WHERE col NOT IN (SELECT MAX(col) FROM table);
30 голосов
/ 28 августа 2008

В 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
17 голосов
/ 28 августа 2008

Я вижу как некоторые специфичные для 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
) 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;
12 голосов
/ 28 августа 2008

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

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

или

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

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

7 голосов
/ 23 января 2013

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

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

6 голосов
/ 28 августа 2008

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

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
4 голосов
/ 25 октября 2012

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

SELECT `Column` FROM `Table` ORDER BY `Column` DESC LIMIT 1,1;
3 голосов
/ 29 июля 2016

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

 SELECT TOP 1 LEAD(MAX (column)) OVER (ORDER BY column desc)
 FROM TABLE 
 GROUP BY column
3 голосов
/ 09 мая 2015
SELECT MAX(Salary) FROM Employee WHERE Salary NOT IN (SELECT MAX(Salary) FROM Employee )

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

...