Postgres 根据 generate_serial 的结果每天查询滚动 SUM
Postgres querying rolling SUM for every day according to a result of generate_serial
我有一个 table,我想进行一个查询,以显示某个时间段内每一天的产品库存,而不仅仅是库存移动完成的日期。
我的解决方案是:
SELECT gs::date, COALESCE(moves,0), btb_goods
FROM generate_series('2017-10-01','2017-11-30',INTERVAL '1 DAY') AS gs
LEFT JOIN (SELECT COALESCE(SUM(btb_menny),0) as moves, btb_goods, btb_date FROM mytable GROUP BY btb_goods, btb_date) AS mozg
ON (date(mozg.btb_date) = gs) ORDER BY 1 ASC;
有效。结果是:
2017-11-05 | 0 | |
2017-11-06 | 0 | |
2017-11-07 | 0 | |
2017-11-08 | 54.1 | sugar |
2017-11-09 | 0 | |
2017-11-10 | 0 | |
2017-11-11 | 0 |
A想要的结果是从库存发生之日起滚动,像这样:
2017-11-05 | 0 | |
2017-11-06 | 0 | |
2017-11-07 | 0 | |
2017-11-08 | 54.1 | sugar |
2017-11-09 | 54.1 | sugar |
2017-11-10 | 54.1 | sugar |
2017-11-11 | 54.1 |
一想,我应该写点什么WHERE mozg.btb_date ‹ ...
但是我不知道如何实现这个。
提前致谢。
这是假设很多,如果它不适用于您的真实数据集,我不会感到震惊,但它应该适用于您的样本:
with cte as (
SELECT
gs::date, COALESCE(moves,0) as moves, btb_goods
FROM generate_series('2017-10-01','2017-11-30',INTERVAL '1 DAY') AS gs
LEFT JOIN (
SELECT COALESCE(SUM(btb_menny),0) as moves, btb_goods, btb_date
FROM mytable
GROUP BY btb_goods, btb_date) AS mozg
ON (date(mozg.btb_date) = gs)
)
select
gs, sum (moves) over (order by gs) as moves,
max (btb_goods) over (order by gs) as btb_goods
from cte
order by gs
缺少的(我认为)是当你遇到另一条非空值的记录时你会怎么做,特别是在文本上(但也在数字上) .您希望如何处理?
换句话说,当您最初查询 returns this:
时,期望的结果是什么
11/1/2017 0
11/2/2017 12 jelly
11/3/2017 0
11/4/2017 15 jam
11/5/2017 0
我有一个 table,我想进行一个查询,以显示某个时间段内每一天的产品库存,而不仅仅是库存移动完成的日期。
我的解决方案是:
SELECT gs::date, COALESCE(moves,0), btb_goods
FROM generate_series('2017-10-01','2017-11-30',INTERVAL '1 DAY') AS gs
LEFT JOIN (SELECT COALESCE(SUM(btb_menny),0) as moves, btb_goods, btb_date FROM mytable GROUP BY btb_goods, btb_date) AS mozg
ON (date(mozg.btb_date) = gs) ORDER BY 1 ASC;
有效。结果是:
2017-11-05 | 0 | |
2017-11-06 | 0 | |
2017-11-07 | 0 | |
2017-11-08 | 54.1 | sugar |
2017-11-09 | 0 | |
2017-11-10 | 0 | |
2017-11-11 | 0 |
A想要的结果是从库存发生之日起滚动,像这样:
2017-11-05 | 0 | |
2017-11-06 | 0 | |
2017-11-07 | 0 | |
2017-11-08 | 54.1 | sugar |
2017-11-09 | 54.1 | sugar |
2017-11-10 | 54.1 | sugar |
2017-11-11 | 54.1 |
一想,我应该写点什么WHERE mozg.btb_date ‹ ...
但是我不知道如何实现这个。
提前致谢。
这是假设很多,如果它不适用于您的真实数据集,我不会感到震惊,但它应该适用于您的样本:
with cte as (
SELECT
gs::date, COALESCE(moves,0) as moves, btb_goods
FROM generate_series('2017-10-01','2017-11-30',INTERVAL '1 DAY') AS gs
LEFT JOIN (
SELECT COALESCE(SUM(btb_menny),0) as moves, btb_goods, btb_date
FROM mytable
GROUP BY btb_goods, btb_date) AS mozg
ON (date(mozg.btb_date) = gs)
)
select
gs, sum (moves) over (order by gs) as moves,
max (btb_goods) over (order by gs) as btb_goods
from cte
order by gs
缺少的(我认为)是当你遇到另一条非空值的记录时你会怎么做,特别是在文本上(但也在数字上) .您希望如何处理?
换句话说,当您最初查询 returns this:
时,期望的结果是什么11/1/2017 0
11/2/2017 12 jelly
11/3/2017 0
11/4/2017 15 jam
11/5/2017 0