我尝试根据查找下一个有效日期并减去一天来确定前一行的到期日来设置取消日期。我有多个项目唯一关键的项目和有效日期(ACEFF),我想反向工程的“期望”(到期)日期,列ACCAN从“有效”日期。最新的项目将具有空的到期日期。
| 关键|有效|(期望)|
| --|--|--|
| A1| 2023年1月1日|2023年1月31日|
| A1| 2019 - 01 - 22 01:00:00| 2023年02月28日|
| A1| 2019 - 01 - 21 10:00:00||
| A2| 2023年1月1日|2019 - 01 - 15 00:00:00|
| A2| 2019 - 01 - 16 00:00:00| 2023年1月31日|
| A2| 2019 - 01 - 22 01:00:00||
这段代码(最初来自这个网站IIRC)应该,但并不一致(在某些情况下,它错误地传播一个exipitation日期跨越多行)。
UPDATE frp011i a
SET a.accan = IFNULL((SELECT b.aceff - 1 DAY
FROM frp011i b
WHERE a.accust = b.accust
AND a.ackey = b.ackey
AND a.actc = b.actc
AND a.aceff < b.aceff
AND a.accan = '0001-01-01' FETCH FIRST ROW ONLY),'0001-01-01')
WHERE a.accan = '0001-01-01'
ORDER BY a.accust,a.ackey,a.actc,a.aceff DESC WITH NC
语句逻辑:对于没有到期日期的每一行(“a”),在同一组(除了生效日期之外,键相同)中查找具有 * 更早 * 生效日期的行(“B”),然后使“a”行的到期日期比“B”的生效日期早一天。
在测试前重置导出的失效日期。不存在重复行。过期日期不是关键。该表没有重复副本。执行环境稳定,不起眼。执行和错误日志是干净的。不存在分配或记录锁定错误。
谢谢你的帮忙。
意想不到的结果,通常以一个无关的日期的形式出现,将其作为失效日期.脚本日志显示没有错误。
1条答案
按热度按时间vdgimpew1#
下面是一种使用
merge
和lead(...) over(...)
的方法(适用于DB2 for I 7.3)| 关键|有效|取消|
| --|--|--|
| A1| 2023-01-01 2023-01-01| * 空 *|
| A1| 2023-02-01| * 空 *|
| A1| 2023-03-01 2023-03-01 2023-03-01| * 空 *|
| A2| 2023-01-01 2023-01-01| * 空 *|
| A2| 2023-01-16| * 空 *|
| A2| 2023-02-01| * 空 *|
| 关键|有效|取消|
| --|--|--|
| A1| 2023-01-01 2023-01-01| 2023-01-31 - 2023-01-31|
| A1| 2023-02-01| 2023-02-28 2023-02-28 2023-02-28|
| A1| 2023-03-01 2023-03-01 2023-03-01| * 空 *|
| A2| 2023-01-01 2023-01-01| 2023-01-15 2023-01-15 2023-01-15|
| A2| 2023-01-16| 2023-01-31 - 2023-01-31|
| A2| 2023-02-01| * 空 *|
| 关键|有效|取消|
| --|--|--|
| A1| 2023-01-01 2023-01-01| 2023-01-31 - 2023-01-31|
| A1| 2023-02-01| 2023-02-28 2023-02-28 2023-02-28|
| A1| 2023-03-01 2023-03-01 2023-03-01| * 空 *|
| A2| 2023-01-01 2023-01-01| 2023-01-15 2023-01-15 2023-01-15|
| A2| 2023-01-16| 2023-01-31 - 2023-01-31|
| A2| 2023-02-01| * 空 *|
fiddle