提问人:Hoàng Phạm Kim 提问时间:1/20/2023 最后编辑:Hoàng Phạm Kim 更新时间:1/20/2023 访问量:583
按前一个值填充 null 值,并按 Postgresql 分组
Fill null value by previous value and group by Postgresql
问:
我有一个表,我想按日期用以前的值顺序填充空值,但也有一组 例如: 表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中做到这一点?请帮帮我
我已经尝试过了,但我真的不知道该怎么做。我也只是一个新手
答:
0赞
Jonas Metzler
1/20/2023
#1
如果输入数据始终采用这种形式,我们可以使用 和 :GREATEST
LAG
SELECT
xdate,
xgroup,
GREATEST(xvalue, LAG(xvalue) OVER()) AS xvalue
FROM X
ORDER BY xgroup, xdate;
在此处试用示例数据:db<>fiddle
GREATEST
获取两个(或多个)值中的最高值,即 ,从上一行中选择值。NOT NULL
LAG
如果由于可能有更复杂的输入数据,这在您的场景中还不够,请编辑您的问题以添加应涵盖的更多案例。
在此答案中,通过添加 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_
在此处查看演示。
评论