[SQL20] 2番目に高い給与をクエリする

2番目に高い給与を照会する

SQLクエリを記述して、Employeeテーブルで2番目に高い給与を取得します(Salary)

id      salary
1       100
2       200
3       300

たとえば、上記のEmployeeテーブルでは、SQLクエリは2番目に高い給与として200を返す必要があります。2番目に高い給与がない場合、クエリはnullを返す必要があります。

結果は次のとおりです
。200

解決策:
最初に、一般的に使用される並べ替え関数間のデータを見てみましょう。

select salary
      ,row_number() over(order by salary)       as rn
      ,rank() over(order by salary)             as rankn
      ,dense_rank() over(order by salary)       as dense_rn
  from salary
;
salary  rn  rankn   dense_rn
100     1   1       1
100     2   1       1
200     3   3       2
200     4   3       2
300     5   5       3
300     6   5       3

これから、row_number、rank、dense_rankの違いもわかります
。row_numberはデータの各行のシーケンス番号を生成し、ソートフィールドの値が同じかどうかに関係なく、各シーケンス番号は異なります。rank
もシーケンスを生成します。各行の番号、違い並べ替え方法にありますフィールド値が同じで、シーケンス番号が同じで、全体のシーケンス番号が連続していない場合、つまり、シーケンス番号はスキップされます
。dense_rankは、各行のシーケンス番号。ソートフィールドの値が同じ場合、シーケンス番号は同じですが、全体的なシーケンス番号は連続しています。つまり、シリアル番号をスキップしません。

最終的なSQL:

select salary
  from (
        select salary
              ,dense_rank() over(order by salary) as dense_rn
          from salary
        )a
 where dense_rn = 2
 group by salary
;
200

将来同じ給与になると、row_number関数を使用できなくなるため、今回はdense_rank関数を使用することを考慮してください。


備考:テーブルの作成とデータの
テーブルの作成salary(id int、salary int);

給与値に挿入(1,100);
給与値に挿入(2,200);
給与値に挿入(3,300);
給与値に挿入(4,200);
給与値に挿入(5,300);

 

おすすめ

転載: blog.csdn.net/debimeng/article/details/104160445