1

也许这可能是一个简单的问题,但是,我无法找到解决方案

我有这个预期的表:

假设这些数据和列:

PERSONA   FECHA_PERF  SECUENCIA2  NIVEL4_RIESGO
---------+---------+---------+---------+-------
24226517  12.06.2018         53.  00           
24226517  12.06.2018         52.  04           
24226517  12.06.2018         51.  04           
24226517  12.06.2018         26.  04           
24226517  12.06.2018         15.  04           
24226517  12.06.2018         14.  04           
24226517  12.06.2018          7.  04           
24226517  08.05.2018         91.  04           
24226517  08.05.2018         90.  04           
24226517  08.05.2018         89.  03           
24226517  08.05.2018         78.  04           
24226517  08.05.2018         77.  04           
24226517  08.05.2018         69.  04           
24226517  08.05.2018         68.  04           
24226517  08.05.2018         67.  04           
24226517  08.05.2018         66.  04           
24226517  08.05.2018         65.  01           
24226517  08.05.2018         64.  04           
24226517  08.05.2018         63.  04           
24226517  08.05.2018         62.  04           
24226517  08.05.2018         61.  04           
24226517  08.05.2018         60.  04           
24226517  08.05.2018         52.  04           
24226517  08.05.2018         51.  04   

FECHA_PERF 是日期字段,Secuencia2 是整数字段,Nivel4_riesgo 是 Char(2) 字段,persona 是 char (9) 字段

我需要为每个PERSONA字段获取已插入表中的最新 NIVEL4_RIESGO 值,我需要同时考虑FECHA_PERFSECUENCIA2字段

该表还有许多其他字段,但为了结果,这些是需要的字段

查询的期望结果应该是:

--------------+---------
PERSONA  NIVEL4_RIESGO  
--------------+---------
24226517 00  

对应于这条记录:

---------+---------+---------+---------+-------
PERSONA   FECHA_PERF  SECUENCIA2  NIVEL4_RIESGO
---------+---------+---------+---------+-------
24226517  12.06.2018         53.  00  

您能否提供一种可能的方式来实现这一点?我有,不知何故,这是用子查询排序的,但我想知道是否有更好的方法来做到这一点,特别是在性能方面。我考虑过为每个子查询使用 DB2 临时表,但是在这家商店,嗯,他们对此有点深奥,如果我使用它们就不那么高兴了

SELECT A.PERSONA, A.NIVEL4_RIESGO                                    
FROM DIGEIN.GIPERF_PERS_GPP AS A                                     
  INNER JOIN                                                         
  (  SELECT PERSONA                                                  
           ,MAX(CHAR(VARCHAR_FORMAT(B.FECHA_PERF,'YYYY-MM-DD'),10) ||
                TRIM(TO_CHAR(B.SECUENCIA2,'00'))) AS VALORX          
           ,MAX(FECHA_PERF)                                          
           ,MAX(SECUENCIA2)                                          
     FROM DIGEIN.GIPERF_PERS_GPP AS B                                
     WHERE PERSONA = '24226517'                                      
       AND B.NIVEL4_RIESGO <> ''                                     
     GROUP BY  PERSONA                                               
  ) AS C                                                             
    ON A.PERSONA = C.PERSONA                                         
   AND CHAR(VARCHAR_FORMAT(A.FECHA_PERF,'YYYY-MM-DD'),10) ||         
       TRIM(TO_CHAR(A.SECUENCIA2,'00')) =                            
       C.VALORX                                                      

这个查询结果是:

---------+---------+---
PERSONA   NIVEL4_RIESGO
---------+---------+---
24226517  00   

这是我需要的。

4

1 回答 1

1

如果我理解正确,这通常可以使用row_number()

select p.*
from (select p.*,
             row_number() over (partition by persona
                                order by fecha_perf desc, secuencia2 desc
                               ) as seqnum
      from DIGEIN.GIPERF_PERS_GPP p
     ) p
where seqnum = 1;

如果您只想要一个人的结果,您可以使用更简单的:

select p.*
from DIGEIN.GIPERF_PERS_GPP p
where persona = XXX
order by fecha_perf desc, secuencia2 desc
fetch first 1 row only;
于 2018-07-12T11:05:28.337 回答