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__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
这正是我所需要的。如果我理解正确,这通常会使用
行号()来完成。
:
如果您只想要一个人的结果,可以使用更简单的:
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;