【问题标题】:Getting an approximate previous year's value获得前一年的近似值
【发布时间】:2021-08-16 17:44:27
【问题描述】:

我有一个包含以下示例行的表:

Product Date        Revenue
A       2021-05-10  20
A       2021-03-20  10
A       2020-01-10  5
A       2020-03-10  6
A       2020-04-10  7

对于每个产品和日期,我想从其原始日期获取最接近去年的日期。例如,第一行的日期是 2021-05-10,与上一年最接近的日期是 2020-04-10。我想要的结果输出如下:

Product Date        Revenue   PrevDate  PrevRevenue
A       2021-05-10  20        2020-04-10   7
A       2021-03-20  10        2020-03-10   6
A       2020-01-10  5         null         null
A       2020-03-10  6         null         null
A       2020-04-10  7         null         null

我将如何实现这样的目标?

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    与 Gordon 建议的查询略有不同:

    您可以使用LEFT LATERAL JOIN 过滤从当前日期到上一年最接近的日期,方法是减去 1 年 interval 并使用 LIMIT 1 排序:

    SELECT t1.*,t2.prevdate,t2.prevrevenue FROM t t1
    LEFT JOIN LATERAL 
      (SELECT product,date,revenue FROM t t2
       WHERE t2.date < t1.date-interval'1 year' AND t1.product = t2.product
       ORDER BY abs(date_part('day',(t1.date-interval' 1year')-t2.date))   
       LIMIT 1) t2 (product,prevdate,prevrevenue) USING (product);
    

    演示:db&lt;&gt;fiddle

    【讨论】:

      【解决方案2】:

      一种方法使用横向连接:

      select t1.*, t2.*
      from t t1 left join lateral
           (select t2.*
            from t t2
            where t2.product = t1.product and
                  t2.date < dateadd(month, -6, t1.date)
            order by abs(t2.date - (t1.date - interval '1 year'))
           ) t2
           on 1=1;
      

      【讨论】:

      • 我收到此错误:mismatched input 'outer' expecting &lt;EOF&gt;(line 1, pos 39)
      • @razer 。 . .您更改了该问题的数据库。我更新了答案。
      • 我现在收到这个错误:不匹配的输入'来自'期望 (line 2, pos 0)
      • @a_horse_with_no_name 。 . .谢谢。
      • 最后一个括号也没有连接括号
      猜你喜欢
      • 2019-10-14
      • 2021-11-27
      • 2017-08-31
      • 2018-10-09
      • 2020-09-15
      • 2011-12-10
      • 1970-01-01
      • 2022-06-10
      • 2017-08-08
      相关资源
      最近更新 更多