iSeries SQL:在JOIN条件中使用上一条记录的值
解决方案
方法1:CALNDR表已维护上一工作日字段
如果你的CALNDR表已经包含PREV_WORKDAY这类预存上一工作日的字段,直接通过当前日期关联CALNDR拿到目标日期,再关联交易表即可:
SELECT t.* FROM TRNHST t JOIN ( SELECT PREV_WORKDAY FROM CALNDR WHERE CAL_DATE = CURRENT_DATE ) c ON t.TRN_DATE = c.PREV_WORKDAY;
注:这里假设TRNHST的交易日期字段为TRN_DATE,CALNDR的日期字段为CAL_DATE。若当前日期非工作日(周末/节假日),子查询会返回空,可调整为先取当前日期前最近的工作日,再获取其上一工作日:
SELECT t.* FROM TRNHST t JOIN ( SELECT PREV_WORKDAY FROM CALNDR WHERE CAL_DATE = ( SELECT MAX(CAL_DATE) FROM CALNDR WHERE CAL_DATE <= CURRENT_DATE ) ) c ON t.TRN_DATE = c.PREV_WORKDAY;
方法2:动态计算上一工作日(CALNDR仅存工作日记录)
如果CALNDR表只存储所有工作日的日期,没有预存上一工作日字段,可通过窗口函数LAG()动态计算:
WITH ranked_calendar AS ( SELECT CAL_DATE, LAG(CAL_DATE) OVER(ORDER BY CAL_DATE) AS PREV_WORKDAY FROM CALNDR ) SELECT t.* FROM TRNHST t JOIN ( SELECT PREV_WORKDAY FROM ranked_calendar WHERE CAL_DATE = ( SELECT MAX(CAL_DATE) FROM CALNDR WHERE CAL_DATE <= CURRENT_DATE ) ) c ON t.TRN_DATE = c.PREV_WORKDAY;
额外提示
- 确保CALNDR表中仅包含有效工作日,无周末或节假日记录。
- 若日期格式不匹配,可使用
CAST(CURRENT_DATE AS DATE)统一类型。 - 测试时可将
CURRENT_DATE替换为具体日期(如DATE('2024-05-20'))验证结果。
内容的提问来源于stack exchange,提问作者cwindingland
相关产品推荐
相关产品推荐

