如何在 oracle SQL 中使用 "over(partition by)" 获得第二个最高薪水?
How I can get Second max salary using "over(partition by)" in oracle SQL?
我已经通过查询获得了它:
SELECT *
FROM
(
SELECT emp_id,salary,row_number() over(order by salary desc) AS rk
FROM test_qaium
)
where rk=2;
但是我的一位朋友让我从员工 table 中找到第二 MAX
薪水必须使用 oracle sql 中的“over(partition by )
”。任何人都请帮助我。
并清除 oracle sql 中“Partition by
”的概念。
如果您有多位员工的薪水相同,您的查询将不起作用...
尝试:
SELECT emp_id,
salary,
dense_rank() over(order by salary desc) AS rk
FROM test_qaium
partition by
子句的作用类似于分组依据,这里没有任何需要分组的内容。
Oracle 设置:
CREATE TABLE test_qaium ( emp_id, salary, department_id ) AS
SELECT 1, 10000, 1 FROM DUAL UNION ALL
SELECT 2, 20000, 1 FROM DUAL UNION ALL
SELECT 3, 30000, 1 FROM DUAL UNION ALL
SELECT 4, 40000, 1 FROM DUAL UNION ALL -- One highest, one 2nd highest
SELECT 5, 10000, 2 FROM DUAL UNION ALL
SELECT 6, 20000, 2 FROM DUAL UNION ALL
SELECT 7, 30000, 2 FROM DUAL UNION ALL
SELECT 8, 30000, 2 FROM DUAL UNION ALL -- Two highest, one 2nd highest
SELECT 9, 10000, 3 FROM DUAL UNION ALL
SELECT 10, 10000, 3 FROM DUAL UNION ALL -- Two highest, no 2nd highest
SELECT 11, 10000, 4 FROM DUAL UNION ALL -- One highest, no 2nd highest
SELECT 12, 20000, 5 FROM DUAL UNION ALL
SELECT 13, 20000, 5 FROM DUAL UNION ALL
SELECT 14, 30000, 5 FROM DUAL; -- One highest, Two 2nd highest
查询:
这将获取每个部门薪水第二高的所有行:
SELECT *
FROM (
SELECT t.*,
DENSE_RANK() OVER (PARTITION BY department_id
ORDER BY salary DESC) AS rnk
FROM test_qaium t
)
WHERE rnk=2;
输出:
EMP_ID SALARY DEPARTMENT_ID RNK
------ ------ ------------- ---
3 30000 1 2
6 20000 2 2
12 20000 5 2
13 20000 5 2
我已经通过查询获得了它:
SELECT *
FROM
(
SELECT emp_id,salary,row_number() over(order by salary desc) AS rk
FROM test_qaium
)
where rk=2;
但是我的一位朋友让我从员工 table 中找到第二 MAX
薪水必须使用 oracle sql 中的“over(partition by )
”。任何人都请帮助我。
并清除 oracle sql 中“Partition by
”的概念。
如果您有多位员工的薪水相同,您的查询将不起作用...
尝试:
SELECT emp_id,
salary,
dense_rank() over(order by salary desc) AS rk
FROM test_qaium
partition by
子句的作用类似于分组依据,这里没有任何需要分组的内容。
Oracle 设置:
CREATE TABLE test_qaium ( emp_id, salary, department_id ) AS
SELECT 1, 10000, 1 FROM DUAL UNION ALL
SELECT 2, 20000, 1 FROM DUAL UNION ALL
SELECT 3, 30000, 1 FROM DUAL UNION ALL
SELECT 4, 40000, 1 FROM DUAL UNION ALL -- One highest, one 2nd highest
SELECT 5, 10000, 2 FROM DUAL UNION ALL
SELECT 6, 20000, 2 FROM DUAL UNION ALL
SELECT 7, 30000, 2 FROM DUAL UNION ALL
SELECT 8, 30000, 2 FROM DUAL UNION ALL -- Two highest, one 2nd highest
SELECT 9, 10000, 3 FROM DUAL UNION ALL
SELECT 10, 10000, 3 FROM DUAL UNION ALL -- Two highest, no 2nd highest
SELECT 11, 10000, 4 FROM DUAL UNION ALL -- One highest, no 2nd highest
SELECT 12, 20000, 5 FROM DUAL UNION ALL
SELECT 13, 20000, 5 FROM DUAL UNION ALL
SELECT 14, 30000, 5 FROM DUAL; -- One highest, Two 2nd highest
查询:
这将获取每个部门薪水第二高的所有行:
SELECT *
FROM (
SELECT t.*,
DENSE_RANK() OVER (PARTITION BY department_id
ORDER BY salary DESC) AS rnk
FROM test_qaium t
)
WHERE rnk=2;
输出:
EMP_ID SALARY DEPARTMENT_ID RNK
------ ------ ------------- ---
3 30000 1 2
6 20000 2 2
12 20000 5 2
13 20000 5 2