用以前的值填充空值并按Postgresql分组

9njqaruj  于 2023-01-25  发布在  PostgreSQL
关注(0)|答案(2)|浏览(107)

我有一个表,我想用以前的值按日期顺序填充空值,但也有一个组,例如:表十:
| 日期|集团|价值|
| - ------|- ------|- ------|
| 2023年1月1日|A类|零|
| 二〇二三年二月一日|A类|凯文|
| 2023年3月1日|A类|零|
| 2023年4月1日|A类|汤姆|
| 2023年5月1日|A类|零|
| 2023年6月1日|A类|零|
| 2023年1月1日|乙|萨拉|
| 二〇二三年二月一日|乙|零|
所以我想按组列分组并填充值列的空值,组可以是多值的,每个组的日期是唯一的。我想得到这样的结果:
| 日期|集团|价值|
| - ------|- ------|- ------|
| 2023年1月1日|A类|零|
| 二〇二三年二月一日|A类|凯文|
| 2023年3月1日|A类|凯文|
| 2023年4月1日|A类|汤姆|
| 2023年5月1日|A类|汤姆|
| 2023年6月1日|A类|汤姆|
| 2023年1月1日|乙|萨拉|
| 二〇二三年二月一日|乙|萨拉|
在postgresql里怎么做?请帮帮我
我试过了,但我真的不知道该怎么做。我也是个新手

r6vfmomb

r6vfmomb1#

如果你可以有一个以上的NULL值连续,LAG函数将不会帮助你太多。一个通用的解决方案将用途:

  • COUNT窗函数用于生成一个非空值和连续空值的划分
  • 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_

检查here演示。

bis0qfac

bis0qfac2#

如果输入数据总是这种形式,我们可以使用GREATESTLAG

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

使用示例数据在此处进行尝试:db<>fiddle
GREATEST获取两个(或多个)值中的最高值,即NOT NULLLAG从前一行中选择值。
如果由于输入数据可能更复杂而导致这在您的场景中不够充分,请编辑您的问题以添加应涵盖的其他情况。
在这个答案中,通过添加一个x来重命名列,因为原始名称是SQL关键字,应该尽可能避免。

相关问题