按前一个值填充 null 值,并按 Postgresql 分组

Fill null value by previous value and group by Postgresql

提问人:Hoàng Phạm Kim 提问时间:1/20/2023 最后编辑:Hoàng Phạm Kim 更新时间:1/20/2023 访问量:583

问:

我有一个表,我想按日期用以前的值顺序填充空值,但也有一组 例如: 表X:

日期 价值
1/1/2023 一个
2/1/2023 一个 凯文
3/1/2023 一个
4/1/2023 一个 汤姆
5/1/2023 一个
6/1/2023 一个
1/1/2023 B 萨拉
2/1/2023 B

所以我想按组列分组并填写值列的空值,该组可以是多值,并且每个组的日期是唯一的。我想要这样的结果:

日期 价值
1/1/2023 一个
2/1/2023 一个 凯文
3/1/2023 一个 凯文
4/1/2023 一个 汤姆
5/1/2023 一个 汤姆
6/1/2023 一个 汤姆
1/1/2023 B 萨拉
2/1/2023 B 萨拉

我怎样才能在postgresql中做到这一点?请帮帮我

我已经尝试过了,但我真的不知道该怎么做。我也只是一个新手

SQL 数据库 postgresql group-by null

评论


答:

0赞 Jonas Metzler 1/20/2023 #1

如果输入数据始终采用这种形式,我们可以使用 和 :GREATESTLAG

SELECT
xdate, 
xgroup,
GREATEST(xvalue, LAG(xvalue) OVER()) AS xvalue
FROM X
ORDER BY xgroup, xdate;

在此处试用示例数据:db<>fiddle

GREATEST获取两个(或多个)值中的最高值,即 ,从上一行中选择值。NOT NULLLAG

如果由于可能有更复杂的输入数据,这在您的场景中还不够,请编辑您的问题以添加应涵盖的更多案例。

在此答案中,通过添加 x 来重命名列,因为原始名称是 SQL 关键字,应尽可能避免使用。

0赞 lemon 1/20/2023 #2

如果可以连续拥有多个 NULL 值,函数将无济于事。广义解决方案将使用:LAG

  • 用于生成一个非 null 值和连续 null 值的分区的 window 函数COUNT
  • 窗口函数用于重新分配 NULL 值。MAX
WITH cte AS (
    SELECT *,
           COUNT(CASE WHEN value_ IS NOT NULL THEN 1 END) OVER(
               PARTITION BY Group_ 
               ORDER     BY Date_
           ) AS rn
    FROM tab
)
SELECT Date_, Group_, MAX(value_) OVER(PARTITION BY group_, rn) AS value_
FROM cte
ORDER BY group_, Date_

在此处查看演示。