获得前一年的近似值

Posted

技术标签:

【中文标题】获得前一年的近似值【英文标题】: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

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

【问题讨论】:

【参考方案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 。 . .谢谢。 最后一个括号也没有连接括号

以上是关于获得前一年的近似值的主要内容,如果未能解决你的问题,请参考以下文章

java获取当前时间前一周前一月前一年的时间

java获取当前时间前一周前一月前一年的时间

QlikView显示所选时间前一年的数据

php获取前一天,前一个月,前一年的时间

Java-小技巧-004-获取当前时间前一周前一月前一年的时间

mysql 怎么获取前一个月的日期和前一年的日期