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

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

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

используйте смещение для этой цели ... выберите расширение из [dbo]. [Сотрудники] упорядочить по расширению desc смещение 2 строки получить только следующие 1 строку

Jinto John 03.09.2016 09:46
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
175
1
409 490
46
Перейти к ответу Данный вопрос помечен как решенный

Ответы 46

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

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 16.09.2009 04:22

@Craig - LIMIT - это синтаксис MySql, вопрос не указывает версию SQL.

Keith 12.04.2011 13:44

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

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/…

iliketocode 29.01.2016 18:50

Предположим, у вас есть 2 элемента с одинаковым значением, но также самый большой элемент. Думаю надо делать OFFSET 2

Kangkan 04.09.2017 22:17

Добавление предложения GROUP BY устранит повторяющееся условие в этом случае.

Saif 21.03.2018 00:28
Ответ принят как подходящий

SELECT MAX( col )
  FROM table
 WHERE col < ( SELECT MAX( col )
                 FROM table )

Ответ Мэтта и Виной также заботится о дубликатах. Предположим, что наибольшее значение повторяется, тогда использование ответа Мэтта даст правильное второе по величине значение, а если вы использовали подходы наверх 2 по убыванию и мин, вы можете вместо этого получить наибольшее значение.

Pankaj Sharma 01.04.2013 23:22

Что, если есть несколько вторых по величине ... Тогда это не даст всех кортежей

Parth Satra 16.10.2014 04:09

спасибо, использовал это, чтобы найти второе последнее свидание здесь

Shaiju T 07.03.2015 13:32

Намного лучше, чем мой подход с использованием ORDER_BY и LIMIT для внутреннего оператора

andig 08.10.2015 12:58

Обратите внимание, что это не вернет результат, если нет записей перед запрошенной.

andig 08.10.2015 14:42

Работает как шарм!

remykarem 30.06.2017 05:44

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. Этот выдерживает это испытание.

Robin Maben 08.08.2012 10:53

@RobinMaben Робин, как насчет сценария, когда повторяется наибольшее значение? Предположим, что столбец содержит числа от 1 до 100, но 100 повторяется дважды. Тогда это решение даст второе по величине значение 100, что будет неверным. Правильно?

Pankaj Sharma 01.04.2013 23:21

@PankajSharma нет, это все равно будет работать из-за предложения GROUP BY

Joel Coehoorn 02.04.2013 03:35

Это стандартный способ сделать это. Принятый ответ должен быть обновлен до этого.

Guilherme Melo 29.04.2014 18:39

Я получаю сообщение об ошибке, в котором говорится, что я не могу использовать TOP и OFFSET в одном запросе.

Spurious 09.01.2015 16:40

Неважно, все равно это сработало, решение SQL 2012, безусловно, лучшее, спасибо, что поделились!

Spurious 09.01.2015 16:56

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://…

xgMz 25.02.2019 21:55

Запрос на поиск второго по величине числа в строке -

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 лет назад и уже давно отмечен как правильный. Этот ответ ничего не добавляет, и его следует удалить.

DMK 07.04.2014 15:18

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 )

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

Можете ли вы редактировать объяснить, чем это значительно отличается от старых ответов?

Nathan Tuggy 09.05.2015 05:59

Самый простой из всех

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

Пожалуйста, опишите подробнее свой ответ, так как этот пост был найден в посте низкого качества. Только код и ответы «попробуйте это» не приветствуются, поскольку они не предоставляют никакого контента для поиска и почему люди должны «попробовать это».

Paritosh 03.09.2016 12:46

Как вы упомянули, повторяющиеся значения. В таком случае вы можете использовать ОТЧЕТЛИВЫЙ и ГРУППА ПО, чтобы узнать второе по величине значение.

Вот таблица

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

Кажется, это повторение некоторых из существующих ответов.

Pang 06.06.2017 10:40

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

бывший : Имя таблицы = тест

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 строку», тогда будут показаны все строки из второй строки.

Самый оптимизированный и удобный для ресурсов ответ. Я сэкономил довольно много времени, используя его в своем подзапросе. Спасибо.

vibs2006 20.02.2019 13:41

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

Другие вопросы по теме