如何在SQL中构建CASE表达式实现2023年数据的简单预测?
解决方案
先通过子查询计算出各年份的实际box总和,再利用窗口函数LAG()获取前一年的box值,最后通过CASE表达式替换2023年的0值为预测值:
WITH yearly_box AS ( SELECT EXTRACT(YEAR FROM item_.transaction_date)::INT AS year, SUM(CASE WHEN EXTRACT(YEAR FROM CURRENT_DATE) > EXTRACT(YEAR FROM item_.transaction_date) THEN item_.cost ELSE 0 END) AS box FROM item_ GROUP BY year ) SELECT year, CASE WHEN year = EXTRACT(YEAR FROM CURRENT_DATE)::INT AND box = 0 THEN LAG(box) OVER (ORDER BY year) * 1.5 ELSE box END AS box FROM yearly_box ORDER BY year;
代码说明
- CTE
yearly_box:完成原查询逻辑,计算各年份的实际box总和,2023年此时返回0。 - 窗口函数
LAG(box) OVER (ORDER BY year):按年份排序后,获取当前行的前一行(上一年)的box值。 - CASE表达式:判断当前年份是否为系统当前年份且实际
box为0,若是则用上一年的box乘以系数1.5得到预测值,否则保留实际计算的box值。
执行后得到期望结果:
| year | box |
|---|---|
| 2019 | 189.13 |
| 2020 | 104.70 |
| 2021 | 228.40 |
| 2022 | 335.84 |
| 2023 | 503.76 |
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

