sql - 在 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,谢谢)
解决方案
根据您的“示例”表,您应该只使用lead()
:
select . . . ,
add_days(lead(eff_date) over (order by eff_date), -1)
from example;
我不确定您的查询——它提到了 3 个表并且似乎没有使用date
数据类型——与这个问题有什么关系。
推荐阅读
- angular - 如何在 Angular MatAutoComplete MatOption 用户选择中呈现内部 html?
- azure-devops - “az pipelines 运行工件下载”失败并出现错误“找到工件,但类型为‘容器’”
- keras - ResNet50 和 VGG16 用于 2 个通道的数据
- woocommerce - 如何创建多个产品变体 Woocommerce
- python - 让python绘制两个不同比例的不同x轴
- javascript - 为什么 document.anchors 命令不使用第一个链接作为索引 0 而不是第二个链接?
- javascript - 是否有javascript通用链接方法
- javascript - 为什么我在进行新渲染时丢失了我的 chart.js
- linux - Bash 或 Awk 脚本用于合并 X 个字段匹配的行,同时在不匹配的字段中创建范围
- python-3.x - 从由其他列分区的列中返回具有第一个值的记录