sql >> データベース >  >> RDS >> Sqlserver

給与テーブルからN番目に高い給与を検索するSQLクエリ

    Common Table Expression(CTE)を使用して、答えを導き出すことができます。

    テーブルSalariesに次の給与があるとします。

     EmployeeID  Salary
    --------------------
         10101   50,000
         90140   35,000
         90151   72,000
         18010   39,000
         92389   80,000
    

    使用します:

    DECLARE @N int
    SET @N = 3  -- Change the value here to pick a different salary rank
    
    SELECT Salary
    FROM (
        SELECT row_number() OVER (ORDER BY Salary DESC) as SalaryRank, Salary
        FROM Salaries
    ) as SalaryCTE
    WHERE SalaryRank = @N
    

    これにより、給与で降順で並べ替えられた後、各行の行番号が作成され、3番目の行(3番目に高いレコードが含まれます)が取得されます。

    • SQLフィドル

    CTEを望まない(またはSQL 2000で立ち往生している)人のために:

    [ :これは、上記の例よりも著しくパフォーマンスが低下します。それらを実行計画と並べて実行すると、CTEで36%、サブクエリで64%のクエリコストが表示されます]:

    SELECT TOP 1 Salary
    FROM 
    (
        SELECT TOP N Salary
        FROM Salaries
        ORDER BY Salary DESC
    ) SalarySubquery
    ORDER BY Salary ASC
    

    ここで、Nはあなたが定義します。

    SalarySubquery サブクエリ、または括弧で囲まれたクエリに指定したエイリアスです。

    サブクエリは、上位N個の給与を選択します( 3 と言います)。 この場合)、最高の給与で注文します。

    3番目に高い給与を確認したい場合、サブクエリは次のように返します。

     Salary
    -----------
    80,000
    72,000
    50,000
    

    次に、外部クエリはサブクエリから最初の給与を選択します。ただし、今回は昇順で並べ替えます。これは最小から最大に並べ替えられるため、50,000が最初に昇順で並べ替えられます。

    ご覧のとおり、この例では50,000が実際に3番目に高い給与です。



    1. SQL Serverで同等のINSTR()

    2. Oracleで小文字を含む行を見つける4つの方法

    3. 可変サイズの変数リストを使用したMySQLプリペアドステートメント

    4. 更新可能なビューのCHECK句