用缺失期间的平均值填充列中缺失的行

问题描述 投票:0回答:1

我有每个 ID 的每月累计计数器,但在某些月份计数器会丢失。我想根据缺失月份的时间段,用月平均值来填补这些缺失值。

我的桌子看起来像:

身份证 柜台
AAA 2023-09 1000
AAA 2023-10 -
AAA 2023-11 -
AAA 2023-12 4000
BBB 2022-11 2000
BBB 2022-12 -
BBB 2023-01 -
BBB 2022-02 -
BBB 2022-03 4000

我想要什么:

身份证 柜台
AAA 2023-09 1000
AAA 2023-10 2000
AAA 2023-11 3000
AAA 2023-12 4000
BBB 2022-11 2000
BBB 2022-12 2500
BBB 2023-01 3000
BBB 2022-02 3500
BBB 2022-03 4000

如何在 PostgreSQL 中完成此操作?

postgresql missing-data gaps-and-islands
1个回答
0
投票

您通常可以使用窗口函数来计算 Counter 的缺失值,如以下查询所示:

SELECT id
     , month
     , counter
     , first_value(counter) OVER w
      + percent_rank() OVER w
      * ( last_value(counter) OVER w - first_value(counter) OVER w) AS new_counter
  FROM test
WINDOW w AS (PARTITION BY id ORDER BY month RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
 ORDER BY id, month

如果您想更新表,则可以在 UPDATE 函数中使用此查询:

With query AS
( SELECT id
     , month
     , first_value(counter) OVER w
      + percent_rank() OVER w
      * ( last_value(counter) OVER w - first_value(counter) OVER w) AS new_counter
  FROM test
WINDOW w AS (PARTITION BY id ORDER BY month RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
)
UPDATE test AS t
   SET counter = q.new_counter
  FROM query AS q
 WHERE t.id = q.id
   AND t.month = q.month
   AND counter IS null ;

请参阅 dbfiddle

中的演示
© www.soinside.com 2019 - 2024. All rights reserved.