0

我有一个表,其中包含混合顺序的年、月、期、region_code、item_code、current_price 列,如下所示:

时期 REGION_CODE 项目代码 时价
2020 12 41 2500 010111 15
2020 12 41 1500 010111 15
2021 01 41 2500 030333 32.4
2021 01 21 2500 010111 17
2020 11 21 2500 030333 15
2020 12 41 1500 020222 25
2020 11 41 2500 010111 15
2021 01 21 2500 030333 21.5
2020 12 21 2500 020222 25.2
2020 12 41 1500 030333 35
2020 12 21 1500 010111 15.1
2020 11 41 2500 020222 15
2021 01 41 2500 020222 19.8
2020 12 41 2500 030333 35
2020 12 21 1500 020222 25.2
2020 12 21 1500 030333 35.3
2020 12 41 2500 020222 25
2020 11 41 1500 030333 12.9
2020 11 41 1500 010111 15
2020 12 21 2500 030333 35.3
2021 01 21 2500 020222 22.6
2020 11 41 1500 020222 15
2020 11 21 1500 030333 15
2020 11 21 1500 020222 28
2020 11 21 1500 010111 65
2021 01 41 2500 010111 31
2020 11 41 2500 030333 12.9
2021 01 41 1500 030333 32.4
2021 01 21 1500 010111 17
2021 01 41 1500 020222 19.8
2020 12 21 2500 010111 15.1
2021 01 21 1500 030333 21.5
2021 01 21 1500 020222 22.6
2021 01 41 1500 010111 31
2020 11 21 2500 020222 28
2020 11 21 2500 010111 65

我想使用滞后函数获取每个项目的 previous_price,但无法做到这一点。之后,我想计算每年、每月、区域代码和项目的当前和上个月的几何平均值。每个项目每个月都会有一个 TOTAL 行。我想得到的结果表如下所示:(我没有计算演示表的 CUR_GEO_MEAN 和 PREV_GEO_MEAN 值)

REGION_CODE 项目代码 CUR_GEO_MEAN PREV_GEO_MEAN
2020 11 1500 010111 ... ...
2020 11 1500 020222 ... ...
2020 11 1500 030333 ... ...
2020 11 2500 010111 ... ...
2020 11 2500 020222 ... ...
2020 11 2500 030333 ... ...
2020 11 全部的 010111 ... ...
2020 11 全部的 020222 ... ...
2020 11 全部的 030333 ... ...
2020 12 1500 010111 ... ...
2020 12 1500 020222 ... ...
2020 12 1500 030333 ... ...
2020 12 2500 010111 ... ...
2020 12 2500 020222 ... ...
2020 12 2500 030333 ... ...
2020 12 全部的 010111 ... ...
2020 12 全部的 020222 ... ...
2020 12 全部的 030333 ... ...
2021 01 1500 010111 ... ...
2021 01 1500 020222 ... ...
2021 01 1500 030333 ... ...
2021 01 2500 010111 ... ...
2021 01 2500 020222 ... ...
2021 01 2500 030333 ... ...
2021 01 全部的 010111 ... ...
2021 01 全部的 020222 ... ...
2021 01 全部的 030333 ... ...

我试图通过编写大量查询来计算,但都失败了。我是这个领域的新手,所以你展示/建议的一切都会对我有很大帮助。提前致谢。

4

1 回答 1

0

这个查询应该很容易解释,如果有一些我没有抓住的细节,至少应该为您指出解决方案。

with geo as (
 select YEAR, MONTH, REGION_CODE,ITEM_CODE, exp(avg(ln(current_price))) CUR_GEO_MEAN   from tab
 group by YEAR, MONTH,REGION_CODE,ITEM_CODE 
   union all
 select YEAR, MONTH, 'TOTAL' REGION_CODE,ITEM_CODE, exp(avg(ln(current_price))) CUR_GEO_MEAN   from tab
 group by YEAR, MONTH, ITEM_CODE)
select 
 YEAR, MONTH, REGION_CODE, ITEM_CODE, CUR_GEO_MEAN,
 lag(CUR_GEO_MEAN) over (partition by REGION_CODE, ITEM_CODE order by YEAR, MONTH) as PREV_GEO_MEAN
from geo
order by YEAR, MONTH, REGION_CODE, ITEM_CODE; 

您可能希望LAG使用不同的分区和/或顺序来调整该功能,或者如果您想考虑错误月份。

于 2021-01-07T21:20:35.770 回答