回答:
最高値が1回しか発生しないと仮定すると、別の方法で使用できますOFFSET
(SQL Server 2012以降)。
SELECT *
FROM tablename
ORDER BY column DESC
OFFSET 1 ROW
FETCH NEXT 1 ROW ONLY;
一般的な解決策は次のようになります。
;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)
2番目に高い値を持つ最初のレコードのIDを知る必要がある場合は、このアプローチを変更して内側の選択に含めることができるはずです(2つの60と2つの55のデータセットがあると仮定)
ROW_NUMBER()
がDENSE_RANK()
できます。他のすべての列も無料で取得できます。使用する必要はありませんGROUP BY
。