Oracle SQL 分区和排名
Oracle SQL Partitions and Rank
我希望能够按员工(包括他们工作的部门和经理)的最新项目的生效日期对数据进行分组。这是数据示例。
PROJ_TBL
+-------------+----------+----------------+
| EMPLOYEE_ID | EFF_DATE | EMPL_PROJECT |
+-------------+----------+----------------+
| P1441 | 05/21/11 | IMC |
| P1441 | 09/12/12 | BEEB |
| P1441 | 09/23/12 | PRUD_FIN_SALES |
+-------------+----------+----------------+
EMPLOYEE_TBL
+-------------+--------------+---------+----------+
| EMPLOYEE_ID | PROJECT_MBR | DEPT_NM | EFF_DATE |
+-------------+--------------+---------+----------+
| P1441 | BEN DEENEY | ACCNT | 02/09/08 |
| P1566 | LAURA FIELDS | ACCNT | 05/03/10 |
| P2155 | PAUL DAVEY | ACCNT | 10/03/10 |
| P1441 | BEN DEENEY | SALES | 07/19/12 |
+-------------+--------------+---------+----------+
EMP_DPT_TBL
+-------------+---------------+---------+----------+
| EMPLOYEE_ID | MANAGER | DEPT_NM | EFF_DATE |
+-------------+---------------+---------+----------+
| P1441 | BOB PAISLEY | ACCNT | 02/09/08 |
| P1441 | LINDA HARDY | SALES | 07/19/12 |
+-------------+---------------+---------+----------+
我对分区的使用不是很熟悉。我希望能够使用它来组合信息以获得 EMPLOYEE_ID
P1441
的当前数据。期望的输出是:
+-------------+---------+--------------+----------------+
| EMPLOYEE_ID | DEPT_NM | MANAGER | PROJECT |
+-------------+---------+--------------+----------------+
| P1441 | SALES | LINDA HARDY | PRUD_FIN_SALES |
+-------------+---------+--------------+----------------+
我能够为各个表获取正确的当前记录,但是组合结果生成我想要的结果是有问题的。这是查询...
-- Current Project
SELECT EMPL_PROJECT,
EMPLOYEE_ID,
EFF_DT
FROM ( SELECT EMPL_PROJECT,
EMPLOYEE_ID,
EFF_DT,
RANK() OVER ( PARTITION BY EMPLOYEE_ID
ORDER BY EFF_DT DESC) AS rk1
FROM PROJ_TBL ) t
WHERE rk1 = 1
-- Current Department
SELECT DEPT_NM,
EMPLOYEE_ID,
EFF_DT
FROM ( SELECT DEPT_NM,
EMPLOYEE_ID,
EFF_DT,
RANK() OVER ( PARTITION BY EMPLOYEE_ID
ORDER BY EFF_DT DESC ) AS rk2
FROM EMPLOYEE_TBL ) t
WHERE rk2 = 1
-- Current Manager
SELECT MANAGER,
EMPLOYEE_ID,
EFF_DT
FROM ( SELECT MANAGER,
EMPLOYEE_ID,
EFF_DT,
RANK() OVER ( PARTITION BY EMPLOYEE_ID
ORDER BY EFF_DT DESC ) AS rk3
FROM EMP_DPT_TBL ) t
WHERE rk3 = 1
如何使用 EMPLOYEE_ID
将这些组合成一个查询来生成报告?
这是您要找的吗?
SELECT DISTINCT
EMPLOYEE_ID
,first_value(dept.dept_nm) over (partition by dept.employee_id order by dept.eff_date desc) as DEPT_NM
,first_value(dept.manager) over (partition by dept.employee_id order by dept.eff_date desc) as MANAGER
,first_value(proj.EMPL_PROJECT) over (partition by proj.employee_id order by proj.eff_date desc) as PROJECT
FROM
EMPLOYEE_TBL emp
INNER JOIN PROJ_TBL proj ON emp.EMPLOYEE_ID = proj.EMPLOYEE_ID
INNER JOIN EMP_DPT_TBL dept on emp.EMPLOYEE_ID = dept.EMPLOYEE_ID
我希望能够按员工(包括他们工作的部门和经理)的最新项目的生效日期对数据进行分组。这是数据示例。
PROJ_TBL
+-------------+----------+----------------+
| EMPLOYEE_ID | EFF_DATE | EMPL_PROJECT |
+-------------+----------+----------------+
| P1441 | 05/21/11 | IMC |
| P1441 | 09/12/12 | BEEB |
| P1441 | 09/23/12 | PRUD_FIN_SALES |
+-------------+----------+----------------+
EMPLOYEE_TBL
+-------------+--------------+---------+----------+
| EMPLOYEE_ID | PROJECT_MBR | DEPT_NM | EFF_DATE |
+-------------+--------------+---------+----------+
| P1441 | BEN DEENEY | ACCNT | 02/09/08 |
| P1566 | LAURA FIELDS | ACCNT | 05/03/10 |
| P2155 | PAUL DAVEY | ACCNT | 10/03/10 |
| P1441 | BEN DEENEY | SALES | 07/19/12 |
+-------------+--------------+---------+----------+
EMP_DPT_TBL
+-------------+---------------+---------+----------+
| EMPLOYEE_ID | MANAGER | DEPT_NM | EFF_DATE |
+-------------+---------------+---------+----------+
| P1441 | BOB PAISLEY | ACCNT | 02/09/08 |
| P1441 | LINDA HARDY | SALES | 07/19/12 |
+-------------+---------------+---------+----------+
我对分区的使用不是很熟悉。我希望能够使用它来组合信息以获得 EMPLOYEE_ID
P1441
的当前数据。期望的输出是:
+-------------+---------+--------------+----------------+
| EMPLOYEE_ID | DEPT_NM | MANAGER | PROJECT |
+-------------+---------+--------------+----------------+
| P1441 | SALES | LINDA HARDY | PRUD_FIN_SALES |
+-------------+---------+--------------+----------------+
我能够为各个表获取正确的当前记录,但是组合结果生成我想要的结果是有问题的。这是查询...
-- Current Project
SELECT EMPL_PROJECT,
EMPLOYEE_ID,
EFF_DT
FROM ( SELECT EMPL_PROJECT,
EMPLOYEE_ID,
EFF_DT,
RANK() OVER ( PARTITION BY EMPLOYEE_ID
ORDER BY EFF_DT DESC) AS rk1
FROM PROJ_TBL ) t
WHERE rk1 = 1
-- Current Department
SELECT DEPT_NM,
EMPLOYEE_ID,
EFF_DT
FROM ( SELECT DEPT_NM,
EMPLOYEE_ID,
EFF_DT,
RANK() OVER ( PARTITION BY EMPLOYEE_ID
ORDER BY EFF_DT DESC ) AS rk2
FROM EMPLOYEE_TBL ) t
WHERE rk2 = 1
-- Current Manager
SELECT MANAGER,
EMPLOYEE_ID,
EFF_DT
FROM ( SELECT MANAGER,
EMPLOYEE_ID,
EFF_DT,
RANK() OVER ( PARTITION BY EMPLOYEE_ID
ORDER BY EFF_DT DESC ) AS rk3
FROM EMP_DPT_TBL ) t
WHERE rk3 = 1
如何使用 EMPLOYEE_ID
将这些组合成一个查询来生成报告?
这是您要找的吗?
SELECT DISTINCT
EMPLOYEE_ID
,first_value(dept.dept_nm) over (partition by dept.employee_id order by dept.eff_date desc) as DEPT_NM
,first_value(dept.manager) over (partition by dept.employee_id order by dept.eff_date desc) as MANAGER
,first_value(proj.EMPL_PROJECT) over (partition by proj.employee_id order by proj.eff_date desc) as PROJECT
FROM
EMPLOYEE_TBL emp
INNER JOIN PROJ_TBL proj ON emp.EMPLOYEE_ID = proj.EMPLOYEE_ID
INNER JOIN EMP_DPT_TBL dept on emp.EMPLOYEE_ID = dept.EMPLOYEE_ID