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()
функцию управления окнами. Если вы хотите получить 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-ю)
ROW_NUMBER()
сDENSE_RANK()
- вы получаете также все другие столбцы бесплатно. Не нужно использоватьGROUP BY
.