gpt4 book ai didi

sql - PostgreSQL 查询中每个月的最后三个月平均值

转载 作者:行者123 更新时间:2023-11-29 11:37:11 32 4
gpt4 key购买 nike

我正在尝试在 Postgresql 中构建一个将用于预算的查询。

我目前有一个按月分组的数据列表。

对于一年中的每个月,我需要检索前三个月的平均月销售额。例如,在 1 月份,我需要上一年 10 月到 12 月的平均月销售额。所以结果会是这样的:

1  12345.67
2 54321.56
3 242412.45

这是按月份分组的。

这是我的查询中的一段代码,可以获取当月的销售额:

LEFT JOIN (SELECT SUM((sti.cost + sti.freight) * sti.case_qty * sti.release_qty)
AS trsf_cost,
DATE_PART('month', st.invoice_dt) as month
FROM stransitem sti,
stocktrans st
WHERE sti.invoice_no = st.invoice_no
AND st.invoice_dt >= date_trunc('year', current_date)
AND st.location_cd = 'SLC'
AND st.order_st != 'DEL'
GROUP BY month) as trsf_cogs ON trsf_cogs.month = totals.month

我需要另一个连接来获得相同的结果,只是前 3 个月的平均值,但我不确定如何实现。

这将始终是一月至十二月 (1-12) 的列表,从一月开始到十二月结束。

最佳答案

这是窗口函数的经典问题。解决方法如下:

SELECT month_nr
,(COALESCE(m1, 0)
+ COALESCE(m2, 0)
+ COALESCE(m3, 0))
/
NULLIF ( CASE WHEN m1 IS NULL THEN 0 ELSE 1 END
+ CASE WHEN m2 IS NULL THEN 0 ELSE 1 END
+ CASE WHEN m3 IS NULL THEN 0 ELSE 1 END, 0) AS avg_prev_3_months
-- or divide by 3 if 3 previous months are guaranteed or you don't care
FROM (
SELECT date_part('month', month) as month_nr
,lag(trsf_cost, 1) OVER w AS m1
,lag(trsf_cost, 2) OVER w AS m2
,lag(trsf_cost, 3) OVER w AS m3
FROM (
SELECT date_part( 'month', month) as trsf_cost -- some dummy nr. for demo
,month
FROM generate_series('2010-01-01 0:0'::timestamp
,'2012-01-01 0:0'::timestamp, '1 month') month
) x
WINDOW w AS (ORDER BY month)
) y;

这要求不遗漏任何月份!否则,看看这个相关的答案:
How to compare the current row with next and previous row in PostgreSQL?

计算每个月的正确平均值。如果只有前两个飞蛾,则除以 2,依此类推。如果没有前一个。月,结果为 NULL。

在你的子查询中,使用

date_trunc('month', st.invoice_dt)::date AS month

代替

DATE_PART('month', st.invoice_dt) as month

因此您可以轻松地对历年的月份进行排序!

更多信息

关于sql - PostgreSQL 查询中每个月的最后三个月平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8089244/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com