按月分组的最后一个值,用于报告每月进度
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
您好,我有一个 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