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);