id value
1 50
2 60
3 55
select max(value) from tablename;
Як правило, ми знаємо, ми отримаємо 60, але мені потрібно наступне значення 55.
Як отримати значення 55 за допомогою SQL?
id value
1 50
2 60
3 55
select max(value) from tablename;
Як правило, ми знаємо, ми отримаємо 60, але мені потрібно наступне значення 55.
Як отримати значення 55 за допомогою SQL?
Відповіді:
Припускаючи, що найвище значення виникає лише один раз, іншим способом було б використання OFFSET
(SQL Server 2012 або новіших версій):
SELECT *
FROM tablename
ORDER BY column DESC
OFFSET 1 ROW
FETCH NEXT 1 ROW ONLY;
Для того, щоб отримати друге місце виразного значення в таблиці , ви можете використовувати
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);
Загальне рішення може бути таким:
;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 рядки з усіма необхідними стовпцями.
У вас є звичайний верхній трюк, такий як:
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
Ви також можете використовувати функцію 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-мами)
ROW_NUMBER()
зDENSE_RANK()
- ви отримуєте також всі інші стовпці безкоштовно. Не потрібно користуватисяGROUP BY
.