DB2SQL—检索字段';s最大值以及其他字段

DB2SQL—检索字段';s最大值以及其他字段,sql,db2,Sql,Db2,也许这是一个简单的问题,但我想不出解决办法 我有一张未来的桌子: 假设以下数据和列: PERSONA FECHA_PERF SECUENCIA2 NIVEL4_RIESGO ---------+---------+---------+---------+------- 24226517 12.06.2018 53. 00 24226517 12.06.2018 52. 04 24226517 12.06

也许这是一个简单的问题,但我想不出解决办法

我有一张未来的桌子:

假设以下数据和列:

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是一个字符(2)字段,persona是一个字符(9)字段

我需要为每个人物字段获取已插入表中的最新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                                                      

这正是我所需要的。

如果我理解正确,这通常会使用
行号()来完成。

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

select p.*
from DIGEIN.GIPERF_PERS_GPP p
where persona = XXX
order by fecha_perf desc, secuencia2 desc
fetch first 1 row only;

为什么当前的解决方案不令人满意?这不是sattisfactory,我只是想知道是否还有其他更简单或更好的方法,特别是考虑到性能问题Gordon,非常感谢您的输入。我只是看了一下手册,OLAP定义,行数内置函数,我不知道,实际上我工作得很好。首先提供的查询工作非常出色。我甚至使用了临时表和几个查询,但这非常有效。谢谢
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;