2017-06-02 65 views
0

我希望能够按照员工最新项目的生效日期对数据进行分组,包括他们工作的部门和经理。这是一个数据样本。Oracle SQL分区和排名

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 | 
+-------------+---------------+---------+----------+ 

我不是很福美来r使用分区。我希望能够使用它来组合信息以获得当前数据EMPLOYEE_IDP1441。所需的输出是:

+-------------+---------+--------------+----------------+ 
| 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生成报告一个查询?

+0

完全无关的问题,但你为什么,在'employee_tbl',同时存储员工的ID和他或她的名字?更好的(规范化)设计是将雇员ID作为主键的不同表格(所以不重复!)以及每个ID和雇员的姓名。这实际上被称为“employee_tbl”。那么你作为第二张表显示的是员工分配到不同部门的历史表格;这个历史表应该只有员工ID,而不是名称 - 对部门来说也是一样的(只包括部门ID并且有单独的DEPARTMENTS_TBL)。 – mathguy

回答

0

这是你在找什么?

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 
+0

我的不好,它似乎在工作,让我再做几次检查 – BreenDeen