postgresql 用前几天的数据填充空行

whhtz7ly  于 2022-11-29  发布在  PostgreSQL
关注(0)|答案(1)|浏览(152)

我有一个表的样子:
| 日期|块日期|安装|
| - -|- -|- -|
| 2022年1月25日|2022年1月10日|三百五十五|
| 2022年1月26日|2022年1月11日|二十个|
| 2022年1月26日|2022年1月12日|七十|
| 2022年1月27日|2022年1月13日|一百五十个|
| 2022年1月27日|2022年1月14日|一百二十|
我想从previous天复制数据并填充current天:
| 日期|块日期|安装|
| - -|- -|- -|
| 2022年1月26日|2022年1月11日|二十个|
| 2022年1月26日|2022年1月12日|七十|
| 2022年1月25日|2022年1月10日|三百五十五|
因此我想看看这张表:
| 日期|块日期|安装|
| - -|- -|- -|
| 一个人。|一个人。|一个人。|
| 2022年1月25日|2022年1月10日|三百五十五|
| 2022年1月26日|2022年1月10日|三百五十五|
| 2022年1月26日|2022年1月11日|二十个|
| 2022年1月26日|2022年1月12日|七十|
| 2022年1月27日|2022年1月10日|三百五十五|
| 2022年1月27日|2022年1月11日|二十个|
| 2022年1月27日|2022年1月12日|七十|
| 2022年1月27日|2022年1月13日|一百五十个|
| 2022年1月27日|2022年1月14日|一百二十|
我需要取一些特定的date,并查看block_date,然后填写一个月前的值。例如:对于2022-01-27,它将是从2022-01-142021-12-15的block_dates(月份间隔,不需要更多)。我需要检查以前的date(2022-01-26,2022 -01-25,2022-01-24等),以填充它,如果它是空的。我不知道如何处理这个问题,我希望,我描述的不是那么可怕。
可能吗?我可以这样描述:

SELECT installs FROM table
WHERE date = '2022-01-27' and block_date = '2022-01-13'
IF block_date EXIST THEN USE THIS
IF block_date = '2022-01-13' NOT EXIST THEN 
SELECT installs WHERE date '2021-01-26' and block_date = '2022-01-13'
AND PUT installs FROM date '2021-01-26' and block_date = '2022-01-13' TO NEW ROW as date '2021-01-27' and block_date = '2022-01-13'

我需要从每个block_date中检查30天前(从block_date开始的月份间隔)并填充它。

63lcw9qa

63lcw9qa1#

你的解释还不完全清楚。
我希望您的查询接近:

WITH Selection AS (
    SELECT * FROM (VALUES
('2022-01-25'::date,'2022-01-10'::date,355),
('2022-01-26'::date,'2022-01-11'::date,20),
('2022-01-26'::date,'2022-01-12'::date,70),
('2022-01-27'::date,'2022-01-13'::date,150),
('2022-01-27'::date,'2022-01-14'::date,120)
) MyTable(date,block_date,installs)
WHERE block_date = '2022-01-13'
AND '2022-01-27' BETWEEN date - '1 month'::interval AND date
)
SELECT generate_series(COALESCE(previous_date, date-1)::timestamp, (date-1)::timestamp, '1 day')::date, block_date, installs
FROM (
    SELECT *, LEAD(date) OVER (ORDER BY date) AS previous_date
    FROM Selection
) T

Selection CTE中设置了1个月的限制。
LEAD窗口函数负责获取date的前一个值,而generate_series将返回一组最多1个月的数据。
尝试一下,看看它是否适合你,如果不适合,请评论它不适合的原因。

相关问题