Получить второе по величине значение в таблице

14
id value
1   50
2   60
3   55

select max(value) from tablename;

Обычно мы знаем, что получим 60, но мне нужно следующее значение 55.

Как получить значение 55 с помощью SQL?

Махфуз Моршед
источник

Ответы:

24

Предполагая, что самое высокое значение встречается только один раз, можно использовать другой способ OFFSET(SQL Server 2012 или более поздняя версия):

SELECT * 
FROM tablename
ORDER BY column DESC 
OFFSET 1 ROW 
FETCH NEXT 1 ROW ONLY;
Ренато Афонсо
источник
23

Для того, чтобы получить второе место отчетливого значения в таблице , вы можете использовать

SELECT MIN(value)
FROM   (SELECT DISTINCT TOP (2) value
        FROM   tablename
        ORDER  BY value DESC)T
/*If only one distinct value return nothing. */
HAVING MIN(value) <> MAX(value);
Мартин Смит
источник
13

Общее решение может быть как ниже:

;WITH CTE AS
(
    SELECT
        Col1
        , Col2
        , <AnyColumns>
        , ROW_NUMBER() OVER (ORDER BY <AnyColumns>) AS RowNum
    FROM <YourTable>
    WHERE <YourCondition>
)
SELECT *
FROM CTE
WHERE RowNum = 2 -- Or any condition which satisfies your problem

Здесь вы также можете определить диапазон, как RowNum >= 10 AND RowNum <= 20. И это даст вам с 10 по 20 строки со всеми необходимыми столбцами.

SwapnilBhate
источник
7

У вас есть обычный главный трюк, такой как:

select top 1 *
from (
    select top 2 *
    from my_table
    order by value desc
    ) t 
order by value asc 

Или вы также можете использовать CTE, как:

with CTE as
(
select value, ROW_NUMBER() over(order by value desc) as ord_id
from my_table
)
select value
from CTE
where ord_id = 2

Или, если вы используете последнюю версию SQLServer (> = 2012), функция отставания .

SELECT  top 1  lag(value, 1,0) OVER (ORDER BY value)  
FROM my_table
order by value desc
irimias
источник
5

Я сделаю так:

SELECT MAX(value)
FROM tablename
WHERE value < (SELECT MAX(value)
               FROM tablename)
Amo
источник
1

Вы также можете использовать ROW_NUMBER()функцию управления окнами. Если вы хотите получить 2-ую запись, упорядоченную по целевому значению, вы можете сделать:

SELECT value 
FROM (
    SELECT 
        ROW_NUMBER() OVER (PARTITION BY NULL ORDER BY value DESC) as RN,
        value
    FROM my_table
) d
WHERE RN = 2

Теперь, если вы хотите получить 2-е наибольшее значение и у вас есть дубликаты, вы можете сгруппировать по записи значения, чтобы вы получали только различные значения.

SELECT value 
FROM (
    SELECT 
        ROW_NUMBER() OVER (PARTITION BY NULL ORDER BY value DESC) as RN,
        value
    FROM my_table
    GROUP BY value
) d
WHERE RN = 2

Вы должны иметь возможность изменить этот подход, чтобы включить MIN(id)во внутренний выбор, если вам нужно знать идентификатор первой записи со вторым самым высоким значением (при условии, что у вас был набор данных с двумя 60-ми и двумя 55-ю)

CodeMonkey
источник
5
Для второй по величине это проще просто заменить ROW_NUMBER()с DENSE_RANK()- вы получаете также все другие столбцы бесплатно. Не нужно использовать GROUP BY.
ypercubeᵀᴹ