获得前一年的近似值
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<>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 <EOF>(line 1, pos 39)
@razer 。 . .您更改了该问题的数据库。我更新了答案。
我现在收到这个错误:不匹配的输入'来自'期望 以上是关于获得前一年的近似值的主要内容,如果未能解决你的问题,请参考以下文章