我有一个产品销售来源数据如下。
Product SalesDate
ProductA 28-Apr-2015
ProductA 28-Apr-2015
ProductA 30-Apr-2015
ProductA 30-Apr-2015
ProductA 30-Apr-2015
ProductA 30-Apr-2015
使用LAG功能获取上一个销售日期。
Product SalesDate PrevDate
ProductA 28-Apr-2015 28-Apr-2015
ProductA 28-Apr-2015 28-Apr-2015
ProductA 30-Apr-2015 28-Apr-2015
ProductA 30-Apr-2015 30-Apr-2015
ProductA 30-Apr-2015 30-Apr-2015
ProductA 30-Apr-2015 30-Apr-2015
使用以下逻辑创建新日期。
CASE WHEN Sales Date - Prev Sales Date <= 10 days THEN Prev Sales Date
ELSE Sales Date
END as New date
我得到的输出是
Product SalesDate PrevDate NewDate
ProductA 28-Apr-2015 28-Apr-2015 28-Apr-2015
ProductA 28-Apr-2015 28-Apr-2015 28-Apr-2015
ProductA 30-Apr-2015 28-Apr-2015 28-Apr-2015
ProductA 30-Apr-2015 30-Apr-2015 30-Apr-2015
ProductA 30-Apr-2015 30-Apr-2015 30-Apr-2015
ProductA 30-Apr-2015 30-Apr-2015 30-Apr-2015
这是棘手的部分。我期待新日期在2015年4月28日的最后3行。为此,每行中的LAG函数应引用上一行的新日期。
这意味着您必须从上一行引用新日期(计算表达式)。
所需的输出如下。
Product SalesDate PrevDate NewDate
ProductA 28-Apr-2015 28-Apr-2015 28-Apr-2015
ProductA 28-Apr-2015 28-Apr-2015 28-Apr-2015
ProductA 30-Apr-2015 28-Apr-2015 28-Apr-2015
ProductA 30-Apr-2015 30-Apr-2015 28-Apr-2015
ProductA 30-Apr-2015 30-Apr-2015 28-Apr-2015
ProductA 30-Apr-2015 30-Apr-2015 28-Apr-2015
非常感谢任何帮助。非常感谢。
答案 0 :(得分:0)
如果您的Oracle版本至少为11g,则可以使用此recursive查询:
with t as (
select product, salesdate,
row_number() over (partition by product order by salesdate) rn
from products),
r(rn, product, salesdate, newdate) as (
select rn, product, salesdate, salesdate newdate from t where rn = 1
union all
select t.rn, t.product, t.salesdate,
case when t.salesdate - r.newdate <= 10 then r.newdate else t.salesdate end
from r join t on r.product = t.product and r.rn + 1 = t.rn)
select * from r
我在demo中添加了两行来检查日期差异情况。