답변:
일반적인 솔루션은 다음과 같습니다.
;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
이제 두 번째로 높은 값을 얻으려고하고 중복 된 값이있는 경우 고유 한 값만 가져 오도록 값 항목별로 그룹화 할 수 있습니다.
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)
두 번째로 높은 값을 가진 첫 번째 레코드의 ID를 알아야하는 경우이 선택 방법을 내부 선택 에 포함하도록이 방법을 수정할 수 있어야합니다 (두 개의 60 및 55로 데이터 세트가 있다고 가정).
ROW_NUMBER()
와 함께DENSE_RANK()
- 당신은 또한 무료로 다른 모든 열을 얻을. 사용할 필요가 없습니다GROUP BY
.