按月分组的最后一个值,用于报告每月进度

Last value grouped by month for reporting monthly progress

您好,我有一个 table 如下所示

grouping_coulmn value date_modified
1 5 2020-10-15
1 10 2020-10-20
2 3 2020-10-20
1 11 2020-11-30
1 11 2020-12-10
1 5 2020-12-15

我如何进行查询return得到以下结果

grouping_column last_value_of_month month
1 10 OCT 2020
1 11 NOV 2020
1 5 DIC 2020
1 5 JAN 2021
2 3 OCT 2020
2 3 NOV 2020
2 3 DIC 2020
2 3 JAN 2021

换句话说,它应该 return 该组每个月的最后一个值,从第一个条目到当前月份。如果你不填补缺失的月份,我可以解决,但我不知道如何解决。

注意:这个问题是在 2021 年 1 月提出的,仅供参考。

首先,根据 table 中最早的日期生成所有月份:

with months as (
  select ddate + interval '1 month' as end_date,
         to_char(ddate, 'MON YYYY') as month
    from generate_series(
           date_trunc(
             'month', 
             (select min(date_modified) from table1)
           ), 
           now(),
           interval '1 month'
         ) as gs(ddate)
)

将其加入您的数据 table,并使用 distinct on 将结果限制为每个 (grouping_column, month):

一条记录
select distinct on (t.grouping_column, m.end_date)
       t.grouping_column, t.value as last_value_of_month, m.month
  from months m
       join table1 t
         on t.date_modified < m.end_date
 order by t.grouping_column, m.end_date, t.date_modified desc;

结果:

 grouping_column | last_value_of_month | month   
 --------------: | ------------------: | :-------
               1 |                  10 | OCT 2020
               1 |                  11 | NOV 2020
               1 |                   5 | DEC 2020
               1 |                   5 | JAN 2021
               2 |                   3 | OCT 2020
               2 |                   3 | NOV 2020
               2 |                   3 | DEC 2020
               2 |                   3 | JAN 2021

db<>fiddle here