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



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



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

693   30  

30 ответов:

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 и выше вы можете использовать :

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
) a

MySQL:

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 sal from salary order by sal desc limit 1 offset 1
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
SELECT 
    * 
FROM 
    table 
WHERE 
    column < (SELECT max(columnq) FROM table) 
ORDER BY 
    column DESC LIMIT 1

Это самый esiest способ:

SELECT
      Column name
FROM
      Table name 
ORDER BY 
      Column name DESC
LIMIT 1,1

Как вы упомянули повторяющиеся значения . В таком случае вы можете использовать DISTINCT и ГРУППЫ ПО чтобы узнать второе по величине значение

таблица

зарплата

:

enter image description here

ГРУППЫ ПО

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

первый часть лимита = начальный индекс

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

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 1 to 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

Comments

    Ничего не найдено.