Отримайте друге найвище значення в таблиці


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 рядки з усіма необхідними стовпцями.


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

5

Я зроблю так:

SELECT MAX(value)
FROM tablename
WHERE value < (SELECT MAX(value)
               FROM tablename)

1

Ви також можете використовувати функцію ROW_NUMBER()вікон. Якщо ви хочете отримати другий запис за замовленням за цільовим значенням, ви можете зробити:

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-мами)


5
Для другої по величині це простіше просто замінити ROW_NUMBER()з DENSE_RANK()- ви отримуєте також всі інші стовпці безкоштовно. Не потрібно користуватися GROUP BY.
ypercubeᵀᴹ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.