创建每月所有天数的列表并将值平均分配到每一天

时间:2021-03-12 10:19:46

标签: sql postgresql

DB-Fiddle

CREATE TABLE costs (
    id SERIAL PRIMARY KEY,
    entry_date DATE,
    costs DECIMAL
);

INSERT INTO costs
(entry_date, costs)
VALUES 

('2020-01-01', '500'),
('2020-02-01', '325'),
('2020-03-01', '200'),
('2020-04-01', '400'),
('2020-05-01', '900'),
('2020-06-01', '700'),
('2020-07-01', '900'),
('2020-08-01', '100'),
('2020-09-01', '300'),
('2020-10-01', '850'),
('2020-11-01', '470'),
('2020-12-01', '800');

预期结果:

date_list     |          costs
--------------|----------------------------
2020-01-01    |      16.12  (=500/31)
2020-01-02    |      16.12  (=500/31)
2020-01-03    |      16.12  (=500/31)
2020-01-04    |      16.12  (=500/31)
:             |      :
:             |      :
2020-12-29    |      25.81  (=800/31)
2020-12-30    |      25.81  (=800/31)
2020-12-31    |      25.81  (=800/31)

在表中,我将每月的费用分配给了每月的一天。
现在,我想创建一个包含每个月所有天数的列表,并将每个月的费用平均分配给每一天。

SELECT
entry_date, 
SUM(costs) AS costs
FROM costs
GROUP BY 1;

您知道我必须如何修改查询才能获得预期结果吗?

1 个答案:

答案 0 :(得分:1)

demo:db<>fiddle

SELECT
    gs::date,
    costs /  COUNT(*) OVER (PARTITION BY entry_date)    -- 3
FROM costs,
    generate_series(                                    -- 2
        entry_date,
        entry_date + interval '1 month - 1 day',        -- 1
        interval '1 day'
    ) gs
  1. 计算一个月的最后一天(将一个月的第一天加到下个月的第一天,从中减去一天)
  2. 生成从月初到月底的日期序列
  3. 您的数据与生成的系列的连接已经复制了成本值,只需除以每个月的天数,这就是 COUNT() 窗口函数在这里所做的