Oracle 每个unqiue员工的最新认证

Oracle 每个unqiue员工的最新认证,oracle,oracle12c,Oracle,Oracle12c,我加入了几个表,以便获得与员工认证相关的数据。我有一个查询,它给我提供了员工id、姓名、认证开始日期JPM_date_6、认证结束日期JPM_date_3以及列中所有认证JPM_DESCR90的列表,并以“,”分隔 SELECT DISTINCT A.EMPLID, A.JOBCODE, A.JOBCODE_DESCR, A.EMPL_STATUS, A.LOCATION, A.LOCATION_DESCR, A.NAME, E.EMAILID, B.EMPLID, E.OPRID,LISTA

我加入了几个表,以便获得与员工认证相关的数据。我有一个查询,它给我提供了员工id、姓名、认证开始日期JPM_date_6、认证结束日期JPM_date_3以及列中所有认证JPM_DESCR90的列表,并以“,”分隔

SELECT DISTINCT A.EMPLID, A.JOBCODE, A.JOBCODE_DESCR, A.EMPL_STATUS, 
A.LOCATION, A.LOCATION_DESCR, A.NAME, E.EMAILID, B.EMPLID, E.OPRID,LISTAGG(C.JPM_DESCR90,',') WITHIN GROUP ( ORDER BY 
C.JPM_DESCR90) AS CertConcat
FROM PS_NPS_VIEW_ALL A, (PS_PERSON_NAME B LEFT OUTER JOIN  PS_NPS_LIC_VW_RPT 
C ON  B.EMPLID = C.EMPLID ), PSOPRDEFN E
WHERE ( A.EFFDT =
    (SELECT MAX(A_ED.EFFDT) FROM PS_NPS_VIEW_ALL A_ED
    WHERE A.EMPLID = A_ED.EMPLID
      AND A.EMPL_RCD = A_ED.EMPL_RCD
      AND A_ED.EFFDT <= SYSDATE)
AND A.EFFSEQ =
    (SELECT MAX(A_ES.EFFSEQ) FROM PS_NPS_VIEW_ALL A_ES
    WHERE A.EMPLID = A_ES.EMPLID
      AND A.EMPL_RCD = A_ES.EMPL_RCD
      AND A.EFFDT = A_ES.EFFDT)
 AND A.EMPLID = B.EMPLID
 AND A.EMPLID = E.EMPLID
 AND A.PER_ORG = 'EMP'
 AND A.EMPL_STATUS='A'
 AND A.PAYGROUP NOT IN ('SUM','CWR'))
GROUP BY A.EMPLID, A.JOBCODE,A.JOBCODE_DESCR, A.EMPL_STATUS, A.LOCATION, 
A.LOCATION_DESCR, A.NAME, E.EMAILID, B.EMPLID, E.OPRID;
这给了我8257行。然后,我尝试获取每个唯一员工id的数据,这样我只能获得一个认证,即最高/最新认证,该认证具有最高的认证结束日期JPM_date_3和认证名称JPM_DESCR90

SELECT DISTINCT A.EMPLID,A.JOBCODE, A.JOBCODE_DESCR, A.EMPL_STATUS, 
A.LOCATION, A.LOCATION_DESCR, A.NAME, E.EMAILID, B.EMPLID, E.OPRID, 
JPM_DATE_3 ,JPM_DATE_6,JPM_DESCR90
FROM PS_NPS_VIEW_ALL A, (PS_PERSON_NAME B LEFT OUTER JOIN  PS_NPS_LIC_VW_RPT 
C ON  B.EMPLID = C.EMPLID ), PSOPRDEFN E
WHERE ( A.EFFDT =
    (SELECT MAX(A_ED.EFFDT) FROM PS_NPS_VIEW_ALL A_ED
    WHERE A.EMPLID = A_ED.EMPLID
      AND A.EMPL_RCD = A_ED.EMPL_RCD
      AND A_ED.EFFDT <= SYSDATE)
AND A.EFFSEQ =
    (SELECT MAX(A_ES.EFFSEQ) FROM PS_NPS_VIEW_ALL A_ES
    WHERE A.EMPLID = A_ES.EMPLID
      AND A.EMPL_RCD = A_ES.EMPL_RCD
      AND A.EFFDT = A_ES.EFFDT)
 AND A.EMPLID = B.EMPLID
 AND A.EMPLID = E.EMPLID
 AND A.PER_ORG = 'EMP'
 AND A.EMPL_STATUS='A'
 AND A.PAYGROUP NOT IN ('SUM','CWR'))
 AND C.JPM_DATE_3=(SELECT MAX(JPM_DATE_3) FROM PS_NPS_LIC_VW_RPT V WHERE 
V.EMPLID=A.EMPLID and V.EMPLID=B.EMPLID AND V.EMPLID=C.EMPLID AND 
V.EMPLID=E.EMPLID )
 GROUP BY A.EMPLID,A.JOBCODE, A.JOBCODE_DESCR, A.EMPL_STATUS, A.LOCATION, 
A.LOCATION_DESCR, A.NAME, E.EMAILID, B.EMPLID, E.OPRID, JPM_DATE_3 
,JPM_DATE_6,JPM_DESCR90;

然而,这给了我5807个独特的行。在进一步的研究中,我发现有相当多的JPM_DATE_3值和JPM_DATE_6值为空,因此我没有得到我想要的计数。请建议对查询进行修改,以便为我提供唯一的员工ID。最新的认证JPM_DESCR90用于最高日期JPM_date_3,并且还会给我JPM_date_3为空的行,这样我就可以拥有8257个唯一的行,就像我应该拥有的每个员工id一样。

这是top-n查询,您在这里和那里查找最后一行。最简单的方法是使用row_number,您只需小心使用partition by和order by子句。然后为每个员工取第一行,证书

下面是连接两个任务的查询,它列出了所有证书,还显示了最新证书的详细信息:

select emplid, name, oprid, jpm_date_3 as last_cert_date3, jpm_date_6 as last_cert_date6,
       jpm_descr90 as last_cert_descr, all_certificates
  from (
    select a.emplid, a.name, e.oprid, c.jpm_date_3, c.jpm_date_6, c.jpm_descr90,
           listagg(c.jpm_descr90,',') within group (order by c.jpm_descr90) 
             over (partition by a.emplid) as all_certificates,
           row_number() over (partition by a.emplid order by jpm_date_3 desc) rnc
      from (
        select ps_nps_view_all.*, 
               row_number() over (partition by emplid, empl_rcd 
                                  order by effdt desc, effseq desc) rna
          from ps_nps_view_all
          where per_org = 'EMP' and empl_status = 'A' 
            and paygroup not in ('SUM', 'CWR') and effdt <= sysdate ) a
      join ps_person_name         b on b.emplid = a.emplid
      left join ps_nps_lic_vw_rpt c on c.emplid = a.emplid
      join psoprdefn              e on e.emplid = a.emplid
      where rna = 1 )
  where rnc = 1
约翰没有证书,汤姆有两行,在主表中还有两行,我们取最后一行

请注意,分析函数row_number、listagg with over子句只允许您触摸数据一次,无需进行自连接并在子查询中查找最大值。另外,请在ansi标准中使用连接,它使内容更具可读性


查询中的问题是您留下了加入的证书,但在where子句中,您试图查找最后一个证书。。。和C.JPM_DATE_3=。。。它将左连接更改为内部连接,部分行丢失。

我这里有18000多行,我预计不会超过8300或8400行。只有您能够找到并决定在某些情况下要做什么,我不知道Emplu rcd之类的列的含义是什么。您可以查看特定员工的数据和输出,并知道是否有出于某种原因需要筛选的行。我解释了逻辑并向您展示了工作演示。如果你能根据我的小提琴向我们展示样本数据并解释更多,我们可以提供更多帮助。