编写一个解决方案查询employee 表中第n高的不同的工资。 如果少于n个不同的工资,查询结果应该为Null
要求
这里当n = 2时 只显示400
sql
CREATE TABLE bytedance(
id varchar2(32) , --登录名,不为空,主键
salary number(24,6)
);
INSERT INTO bytedance VALUES ('A',500);
INSERT INTO bytedance VALUES ('B',400);
INSERT INTO bytedance VALUES ('C',300);
INSERT INTO bytedance VALUES ('D',400);
INSERT INTO bytedance VALUES ('E',500);
解法1
sql
WITH tmp1 AS (
SELECT
id
,salary
,ROW_NUMBER()over(ORDER BY salary desc) rn
FROM bytedance
)
SELECT nvl(salary,'null')
FROM tmp1
WHERE rn=N
row_number()

问题:两个并列第一名 会有1,2的区别,按照姓名字母的顺序给第一和第二
并列第二名 则为第3, 第4 也是根据姓名字母顺序来决定谁是第三
解法2 第2名消失了
rank()over()
sql
SELECT
id
,salary
,rank()over(ORDER BY salary desc) rn
FROM bytedance

第一名有2个,则分数第2名就被统计为第3名了。分数第3的为第5名,第2名和第4名消失了。
三种解决方案放一起
sql
SELECT
id
,salary
,row_number()over(ORDER BY salary desc) rn
,rank()over(ORDER BY salary desc) rk
,DENSE_RANK()over(ORDER BY salary desc) dr
FROM bytedance

分数排第一的,不管几个人都是第一名
分数排第二的,不管几个人都是第二名 奥运会的选择。
sql
WITH tmp1 AS (
SELECT
id
,salary
,DENSE_RANK()over(ORDER BY salary desc) AS dr
FROM bytedance
)
SELECT coalesce(salary,null)
FROM tmp1
WHERE dr='10'
第2个方法
sql
WITH tmp1 AS ( -- 只需要工资 不需要id 先对所有数据去重
SELECT salary
FROM bytedance
GROUP BY
salary
)
, tmp2 AS ( -- 去重后再排序
SELECT
salary
,DENSE_RANK()over(ORDER BY salary desc) AS dr
FROM tmp1
)
SELECT salary
FROM tmp2
WHERE dr=2