我有下表:

CREATE TABLE IF NOT EXISTS test (
                                    date DATE,
                                    value INT
);

INSERT INTO test VALUES
                     ( '2022-01-11', NULL),  -- Tues
                     ( '2022-01-10', 5),  -- Mon
                     ( '2022-01-09', NULL),  -- Sun
                     ( '2022-01-08', 6),  -- Sat
                     ( '2022-01-07', NULL), -- Fri
                     ( '2022-01-06', NULL), -- Thur
                     ( '2022-01-05', 5), -- Wed
                     ( '2022-01-04', NULL), -- Tues
                     ( '2022-01-03', NULL), --Mon
                     ( '2022-01-02', NULL), -- Sun
                     ( '2022-01-01', NULL); -- Sat

转发和回填日历周(星期一到星期日)的值列的查询是什么

对于日历周,应将填充空值转发到下一个非空值,并回填空值直到上一个非空值.如果日历周的值都为空,则周应为空

结果应该如下所示:

date VALUES
'2021-01-11' 5 -- Tues, filled from Monday
'2022-01-10' 5 -- Mon
'2022-01-09' 6 -- Sun Filled from saturday
'2022-01-08' 6 -- Sat
'2022-01-07' 5 -- Fri Filled from Wed
'2022-01-06' 5 -- Thur Filled from Wed
'2022-01-05' 5 -- Wed
'2022-01-04' 5 -- Tues Filled from Wed
'2022-01-03' 5 --Mon Filled from Wed
'2022-01-02' Null -- Sun
'2022-01-01' Null -- Sat No values in week, therefor null

推荐答案

这对于拥有ignore nulls选项的last_value来说是一个很好的位置,但不幸的是,Postgres不支持后者.

以下是在Postgres中使用窗口函数执行此操作的一种方法:

select date, value,
    max(value) over(partition by date_trunc('week', date), grp) new_value
from (
    select t.*,
        count(value) over(partition by date_trunc('week', date) order by date) grp
    from test t
) t
order by date desc

该方法是使用窗口count来构建包含非空值(可能后跟空值)的同一周的连续行的组,然后带来最新的先前非空值.您可以单独运行子查询以查看组是如何构建的.


如果您还希望查询在同一周内没有以前的值可用时查找next值,我们只需展开逻辑并为每行定义两个组,然后同时try 这两个组:

select date, value,
    coalesce(
        max(value) over(partition by date_trunc('week', date), grp1),
        max(value) over(partition by date_trunc('week', date), grp2)
    ) new_value
from (
    select t.*,
        count(value) over(partition by date_trunc('week', date) order by date     ) grp1,
        count(value) over(partition by date_trunc('week', date) order by date desc) grp2
    from test t
) t
order by date desc

100

Sql相关问答推荐

SQL:创建查询以添加减少的总数

Access 365将文本转换回BigInt

替换条件中的单元格值

如何优化我的功能以减少花费的时间?

SQL SELECT MOST NEST TIMESTAMP BEAT ORDER

NULL-生成的列中连接的字符串的输入

查询页面推荐

Oracle中的时间戳

HAVING子句内部过滤的正确方法

我如何才能在付款人单列中拉出只有9个付款人单的人?

最小非重复集的SQL查询

从重复值中获取最新值

如何使用 join 和 where 子句从另一表中仅删除一个表中的值

删除重复记录但保留最新的SQL查询

在自引用表中使用分组和计数的SQL查询语句

如何在插入时将字符串'03-January-2023'转换为日期时间

Postgres:表的累积视图

超过100名员工的连续行

SQL查询以获取从特定可变日期看到的用户

BigQuery 将一行拆分为多列