问题SQL
单独查询SQL
SELECT * FROM (
SELECT D_BUSI_DATE,C_ACC_CODE,N_YE,
ROW_NUMBER() OVER(PARTITION BY C_ACC_CODE ORDER BY d_date DESC) rn
FROM T1
WHERE d_date <= DATE 'XXXX-XX-XX'
) WHERE RN = 1;
关联其他表SQL
SELECT T1.D_BUSI_DATE,T1.C_ACC_CODE,T1.N_YE,T2.* FROM(
SELECT * FROM (
SELECT
D_BUSI_DATE,C_ACC_CODE,N_YE,
ROW_NUMBER() OVER(PARTITION BY C_ACC_CODE ORDER BY d_date DESC) rn
FROM T1
WHERE d_date <= DATE 'XXXX-XX-XX'
) WHERE RN = 1
) T1
LEFT JOIN T2 ON T2.C_ACC_CODE = T1.C_ACC_CODE AND T2.C_ACC_TYPE= T1.C_ACC_TYPE;
问题描述
单独查询和关联表之后的查询结果不一致
单次查询:
D_BUSI_DATE | C_ACC_CODE | N_YE |
---|---|---|
2023-05-05 | 100000 | 80.00 |
关联表查询:
D_BUSI_DATE | C_ACC_CODE | N_YE |
---|---|---|
2023-04-05 | 100000 | 65.00 |
产生原因
- 当PARTITION BY和ORDER BY 字段不唯一,即有重复数据时,导致两次排序结果不一致,取RN = 1时数据不一致
原SQL:
ROW_NUMBER() OVER(PARTITION BY C_ACC_CODE ORDER BY d_date DESC)
修改后:
ROW_NUMBER() OVER(PARTITION BY C_ACC_CODE ORDER BY d_date,D_BUSI_DATE DESC)
记录
目前在11.2版本上并未复现该问题,为客户现场问题,猜测是分组字段和排序字段数据不唯一导致,但目前并不清楚为什么单独查询和关联表之后查询结果不一致。
20240929记录:测试环境再次发生类似问题,表现为SQL执行和程序执行SQL取值结果不一致,怀疑是同一原因,增加ID为ORDER BY字段,但验证时使用修改前和修改后的代码都无上述问题发生,故记录在此。