连接不正常的max()函数-DB2 SQL

连接不正常的max()函数-DB2 SQL,sql,db2-400,Sql,Db2 400,我有一个查询,在这个查询中,我试图查找某些字段中包含最大值的行。我尝试了max(field_name),但它返回了所有行 SELECT CMNT.ID, MAX(CMNT.SEQ_NBR) AS SEQ, CMNT.VER_NBR AS VERSION FROM CUSTOMER_CMNT AS CMNT INNER JOIN CUSTOMER_PROD AS PRODUCT ON PRODUCT.PRODUCT_ID = CMNT.BALE_ID LEFT JOIN CUSTOMER_L

我有一个查询,在这个查询中,我试图查找某些字段中包含最大值的行。我尝试了max(field_name),但它返回了所有行

SELECT CMNT.ID, MAX(CMNT.SEQ_NBR) AS SEQ, CMNT.VER_NBR AS VERSION 
FROM 
CUSTOMER_CMNT AS CMNT
INNER JOIN CUSTOMER_PROD AS PRODUCT ON PRODUCT.PRODUCT_ID = CMNT.BALE_ID 
LEFT JOIN CUSTOMER_LOAN LOAN ON (PRODUCT.LOAN_ID = LOAN.LOAN_ID) AND (PRODUCT.START_YR = LOAN.START_YR) AND (PRODUCT.ST_CD = LOAN.ST_CD) AND (PRODUCT.CNTY_CD = LOAN.CNTY_CD)
WHERE CMNT.ID > 0 AND PRODUCT.START_YR = 2013 AND LOAN.LOAN_NBR = 17124
GROUP BY CMNT.VER_NBR, CMNT.SEQ_NBR, CMNT.ID, CMNT.CMNT_TXT
输出

+----------------+------+---------+
| CMNT.ID        | SEQ  | VERSION |
+----------------+------+---------+
 133340000101373   2       1
 133340000101374   2       1
 133340000101373   3       1
 133340000101374   3       1
 133340000101373   4       1
 133340000101374   4       1
 133340000101373   1       2
 133340000101374   1       2
 133340000101373   1       3
 133340000101374   1       3
 133340000101373   2       3
 133340000101374   2       3
但是,预期的行是(max(SEQ_NBR)):

但是,我修改了查询,如下所示,返回上述预期结果

SELECT CMNT.ID, MAX(CMNT.SEQ_NBR) AS SEQ, CMNT.VER_NBR AS VERSION 
FROM 
CUSTOMER_CMNT AS CMNT
INNER JOIN CUSTOMER_PROD AS PRODUCT ON PRODUCT.PRODUCT_ID = CMNT.BALE_ID 
LEFT JOIN CUSTOMER_LOAN LOAN ON (PRODUCT.LOAN_ID = LOAN.LOAN_ID) AND (PRODUCT.START_YR = LOAN.START_YR) AND (PRODUCT.ST_CD = LOAN.ST_CD) AND (PRODUCT.CNTY_CD = LOAN.CNTY_CD)
WHERE CMNT.ID > 0 AND PRODUCT.START_YR = 2013 AND LOAN.LOAN_NBR = 17124
CMNT.SEQ_NBR = (select max(CMNT.SEQ_NBR) from   
FROM 
CUSTOMER_CMNT AS CMNT
INNER JOIN CUSTOMER_PROD AS PRODUCT ON PRODUCT.PRODUCT_ID = CMNT.BALE_ID 
LEFT JOIN CUSTOMER_LOAN LOAN ON (PRODUCT.LOAN_ID = LOAN.LOAN_ID) AND (PRODUCT.START_YR = LOAN.START_YR) AND (PRODUCT.ST_CD = LOAN.ST_CD) AND (PRODUCT.CNTY_CD = LOAN.CNTY_CD)
WHERE CMNT.ID > 0 AND PRODUCT.START_YR = 2013 AND LOAN.LOAN_NBR = 17124)

由于子查询的原因,此查询的时间更长。有没有办法缩短/改进此查询?

这个怎么样?但不确定它是否表现得更好

declare @data table (cmnt_id bigint, seq int, version int)

insert into @data
values (133340000101373, 2, 1), (133340000101374, 2, 1), (133340000101373, 3, 1), (133340000101374, 3, 1), (133340000101373, 4, 1), (133340000101374, 4, 1), (133340000101373, 1, 2), (133340000101374, 1, 2), (133340000101373, 1, 3), (133340000101374, 1, 3), (133340000101373, 2, 3), (133340000101374, 2, 3)

select d.cmnt_id, d.seq, d.version
from @data d
inner join (
    select cmnt_id, max(seq) as target_seq
    from @data
    group by cmnt_id
    ) x on x.cmnt_id = d.cmnt_id
    and d.seq = x.target_seq
order by d.cmnt_id

理想情况下,通过VisualExplain工具冷运行查询,它将推荐它认为缺少的索引

除此之外,我绝对推荐以下索引/键:

CUSTOMER_CMNT
   index1 => BALE_ID
   index2 => ID, SEQ_NBR

CUSTOMER_PROD
   index1 => START_YR
   index2 => LOAN_ID, START_YR, ST_CD, CNTY_CD

CUSTOMER_LOAN
   index1 => LOAN_NBR
   index2 => LOAN_ID, START_YR, ST_CD, CNTY_CD

可能与连接无关。所述第一查询组以大于期望值的方式进行分组,以实现期望的聚合;如果删除了所有连接条件,只查询了CMNT文件,则会出现相同的结果。第二个查询在语法上不正确,即使标量子选择像AND谓词那样编码但正确,该查询也不可能产生正确的结果。似乎有可能,样本数据只是碰巧产生了预期的输出;实际上是偶然的,而不是故意的;由于缺少分组依据,子选择将选择最大值(SEQ_NBR),而不考虑其他任何内容。
CUSTOMER_CMNT
   index1 => BALE_ID
   index2 => ID, SEQ_NBR

CUSTOMER_PROD
   index1 => START_YR
   index2 => LOAN_ID, START_YR, ST_CD, CNTY_CD

CUSTOMER_LOAN
   index1 => LOAN_NBR
   index2 => LOAN_ID, START_YR, ST_CD, CNTY_CD