テーブルで2番目に高い値を取得する


回答:


24

最高値が1回しか発生しないと仮定すると、別の方法で使用できますOFFSET(SQL Server 2012以降)。

SELECT * 
FROM tablename
ORDER BY column DESC 
OFFSET 1 ROW 
FETCH NEXT 1 ROW ONLY;

24

テーブル内で2番目に高い個別値を取得するには、次のようにします。

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()ウィンドウ関数も使用できます。ターゲット値で並べ替えたときに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のデータセットがあると仮定)


5
2番目に高い場合は、簡単に置き換えることROW_NUMBER()DENSE_RANK()できます。他のすべての列も無料で取得できます。使用する必要はありませんGROUP BY
ypercubeᵀᴹ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.