首页 > 解决方案 > 在 DB2 SQL 中获取上一个值/下一个值

问题描述

我正在尝试从以下示例表中获取一些数据的值:

DEAL_ID | DISC | EFF_DATE | EXP_DATE
  100   |  2   | 01-01-19   | 31-01-2019
  101   |  2   | 01-02-19   | 15-02-2019
  103   |  3   | 01-03-19   | 31-03-2019
  104   |  4   | 01-04-19   | 25-04-2019

如图所示,deal_id 101 和 103 之间有一个时间段,从 16-2-2019 到 28-2-2019,没有分配 DISC 值。在这种情况下,对于没有分配 DEAL/DISC 的任何时间段,它将采用该时间段之前存在的最后一个 EXP_DATE,并将 EXP_DATE 更改为下一个 EFF_DATE,涵盖所有没有分配的时间段,像这样结束表格:

DEAL_ID | DISC | EFF_DATE | EXP_DATE
  100   |  2   | 01-01-19   | 31-01-2019
  101   |  2   | 01-02-19   | 28-02-2019
  103   |  3   | 01-03-19   | 31-03-2019
  104   |  4   | 01-04-19   | 25-04-2019

我确实发现 DB2 有一个 LEAD/LAG 功能,但是,它在我正在使用的版本中无效/不起作用/无法识别(顺便说一句,我不确定哪个版本)。

我目前的代码是:

SELECT A.deal_id as deal_id, A.vendr_nbr, A.vndr_deal_eff_date, A.vndr_deal_exp_date, (YEAR(vndr_deal_eff_date) * 10000 + MONTH(vndr_deal_eff_date)*100 + DAY(vndr_deal_eff_date)) limitDate1EFF, (YEAR(vndr_deal_exp_date) * 10000 + MONTH(vndr_deal_exp_date)*100 + DAY(vndr_deal_exp_date)) limitDate2EXP, B.DISC_CHRG_ID, B.DISCOUNT_VALUE, C.VENDR_DEPT_NBR
FROM workdbo.vendor_deal A
LEFT JOIN workdbo.DDA_DISC_CHRG_TIER B ON A.deal_id = B.DISC_CHRG_ID
LEFT JOIN workdbo.DEAL_DEPT C ON A.deal_id = C.deal_id

任何帮助,将不胜感激。

注意:EFF_DATE 和 EXP_DATE 都是date数据类型,因此被识别。从我发布的查询中,A.vndr_deal_eff_date, A.vndr_deal_exp_date是我正在使用的日期。

(如果帖子需要更改以适应 stackoverflow 指南,请告诉我应该编辑/添加/等什么,而不是只留下 -1,谢谢)

标签: sqldb2

解决方案


根据您的“示例”表,您应该只使用lead()

select . . . ,
       add_days(lead(eff_date) over (order by eff_date), -1)
from example;

我不确定您的查询——它提到了 3 个表并且似乎没有使用date数据类型——与这个问题有什么关系。


推荐阅读