PostgreSQL - 如何获得前一个月和前一周的价值?

PostgreSQL - How to get value previous month & week?

现在我得到每个月的平均值

SELECT EXTRACT(MONTH FROM date_time) AS month, EXTRACT(YEAR FROM date_time) AS year, avg("total") FROM my_table GROUP BY EXTRACT(MONTH FROM date_time), EXTRACT(YEAR FROM date_time)

但是 SQL 查询需要调整,所以 total value current month - previous month

可以吗?

每周

SELECT EXTRACT(WEEK FROM date_time) AS week, EXTRACT(YEAR FROM date_time) AS year, avg("total") FROM my_table GROUP BY EXTRACT(WEEK FROM date_time), EXTRACT(YEAR FROM date_time)

是的,有可能:

SELECT t1.month, t2.year, t1.tot - t2.tot FROM
(
SELECT EXTRACT(MONTH FROM date_time) AS month, EXTRACT(YEAR FROM date_time) AS year, avg("total") AS tot
FROM my_table GROUP BY EXTRACT(MONTH FROM date_time), EXTRACT(YEAR FROM date_time)
) t1
join (
SELECT EXTRACT(MONTH FROM date_time) AS month, EXTRACT(YEAR FROM date_time) AS year, avg("total") AS tot
FROM my_table GROUP BY EXTRACT(MONTH FROM date_time), EXTRACT(YEAR FROM date_time)
) t2
on ((t1.year = t2.year) and (t1.month = t2.month + 1)) or
   ((t1.year = t2.year + 1) and (t1.month = 1) and (t2.month = 12))

我把你的select转换成了两个subselect,分别命名为t1t2,按照left join的标准加入。

请注意,第一个月目前不会有一对,如果您仍然需要它,那么您可以使用 left joincoalesce 来确保即使是未配对的项目也有一个“ pair" 和 NULL for tot 默认为 0.

进一步注意,您可以将此子查询转换为 view 以获得更好的可读性。

如果我没看错,你可以先按年和月对 avg(total) 进行分组,然后使用 LAG() window 函数获取上个月的值,例如:

with my_table(date_time, total) as (
    values
    ('2022-03-29', 10),
    ('2022-04-29', 12),
    ('2022-05-30', 20),
    ('2022-05-31', 30)
)
,grouped as (
    SELECT EXTRACT('MONTH' FROM date_time::timestamp) AS month, EXTRACT('YEAR' FROM date_time::timestamp) AS year, avg("total") AS total
    FROM my_table 
    GROUP BY EXTRACT('MONTH' FROM date_time::timestamp) , EXTRACT('YEAR' FROM date_time::timestamp)
)
SELECT *,  LAG(total) OVER(ORDER BY year, month) as prev_month_total
FROM grouped