Oracle SQL:请参阅上一条记录

时间:2015-06-01 12:57:49

标签: sql oracle

我有一个产品销售来源数据如下。

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

非常感谢任何帮助。非常感谢。

1 个答案:

答案 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

SQLFiddle demo

我在demo中添加了两行来检查日期差异情况。