DB2 SQL-与其他字段一起检索字段的最大值

时间:2018-07-12 08:37:16

标签: sql db2

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

我有这个预期表:

假设此数据和列:

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)字段,角色是char(9)字段

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

该表还有许多其他字段,但是为了便于查询,这些是必填字段

,查询的期望结果应为:

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

我需要什么。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,通常可以使用quantity = Integer.parseInt(quantityText.getText().toString());

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;