Oracle,row_number,正在删除行
Oracle, row_number, deleting rows
我有个小问题。这是一个代码:
select * from
(select department_id, manager_id,last_name, salary, row_number() over
(partition by department_id,manager_id order by salary asc) p_number
from employees )
where p_number <=3;
此查询为部门中的每个经理显示每个部门中最低的 3 个薪水
例如:30 号部门有 2 名经理(100 和 114),100 号经理下面有 1 名员工,114 号经理 - 3 名员工。
部分结果:
20 100 Hartstein 13000 1
20 201 Fay 6000 1
30 100 Raphaely 11000 1
30 114 Colmenares 2500 1
30 114 Himuro 2600 2
30 114 Tobias 2800 3
现在,我想删除经理下面只有 1 名员工的所有行。在这个例子中应该有,Harstein,Fay,Raphaely。科尔梅纳雷斯也有 1 号,但经理 114 下的员工更多。
有任何想法吗?
PS 有 Count out,因为没有 group by,修改
where p_number <=3;
进入
where p_number <=3 and p_number >1;
也出局了,因为它会删除我所有的 1 号员工,我想 'safe' 少一些,因为他们有更多 'colleagues' :)
谢谢!
这将给出结果,只需要一次 table 扫描:
SELECT *
FROM (
SELECT department_id,
manager_id,
last_name,
salary,
ROW_NUMBER()
OVER ( PARTITION BY department_id, manager_id
ORDER BY salary ASC ) AS p_number,
COUNT(*)
OVER ( PARTITION BY department_id, manager_id ) AS p_count
FROM employees
ORDER BY department_id, manager_id, salary
)
WHERE p_count >= 2
AND p_number <= 3;
输出:
DEPARTMENT_ID MANAGER_ID LAST_NAME SALARY P_NUMBER P_COUNT
------------- ---------- ---------- ---------- ---------- ----------
30 114 Colmenares 2500 1 3
30 114 Himuro 2600 2 3
30 114 Tobias 2800 3 3
我有个小问题。这是一个代码:
select * from
(select department_id, manager_id,last_name, salary, row_number() over
(partition by department_id,manager_id order by salary asc) p_number
from employees )
where p_number <=3;
此查询为部门中的每个经理显示每个部门中最低的 3 个薪水 例如:30 号部门有 2 名经理(100 和 114),100 号经理下面有 1 名员工,114 号经理 - 3 名员工。
部分结果:
20 100 Hartstein 13000 1
20 201 Fay 6000 1
30 100 Raphaely 11000 1
30 114 Colmenares 2500 1
30 114 Himuro 2600 2
30 114 Tobias 2800 3
现在,我想删除经理下面只有 1 名员工的所有行。在这个例子中应该有,Harstein,Fay,Raphaely。科尔梅纳雷斯也有 1 号,但经理 114 下的员工更多。 有任何想法吗? PS 有 Count out,因为没有 group by,修改
where p_number <=3;
进入
where p_number <=3 and p_number >1;
也出局了,因为它会删除我所有的 1 号员工,我想 'safe' 少一些,因为他们有更多 'colleagues' :) 谢谢!
这将给出结果,只需要一次 table 扫描:
SELECT *
FROM (
SELECT department_id,
manager_id,
last_name,
salary,
ROW_NUMBER()
OVER ( PARTITION BY department_id, manager_id
ORDER BY salary ASC ) AS p_number,
COUNT(*)
OVER ( PARTITION BY department_id, manager_id ) AS p_count
FROM employees
ORDER BY department_id, manager_id, salary
)
WHERE p_count >= 2
AND p_number <= 3;
输出:
DEPARTMENT_ID MANAGER_ID LAST_NAME SALARY P_NUMBER P_COUNT
------------- ---------- ---------- ---------- ---------- ----------
30 114 Colmenares 2500 1 3
30 114 Himuro 2600 2 3
30 114 Tobias 2800 3 3