【问题标题】:How to update a table with incrementally increased values where a column is null?如何在列为空的情况下使用增量增加的值更新表?
【发布时间】:2021-10-09 21:59:30
【问题描述】:

我有一个包含两列的表格,namenumbernumber 列中的某些值为空。

name | number
-------------
a    | 11  
b    | null   
c    | null

我想在number 列中找到最大值,并用递增的值填充缺失值,如下表:

name | number
-------------
a    | 11  
b    | 12  
c    | 13

如何在 Postgresql 中做到这一点?

【问题讨论】:

  • 对表的更新需要 UPDATE 语句,该语句不能选择列值。由于 UPDATE 和 SELECT 是不同的操作,因此不能像您在此处所暗示的那样一步完成。
  • name是表的主键,还是唯一的?
  • @Dennis 谢谢。但我不介意它是否需要多个步骤。
  • @forpas 我们可以假设它是主要的。如果有通用解决方案,我将不胜感激。

标签: sql postgresql sql-update window-functions


【解决方案1】:

对于此示例数据,您可以在可以连接到表的查询中使用MAX()ROW_NUMBER() 窗口函数:

UPDATE tablename t1
SET number = t2.max_number + t2.rn
FROM (
  SELECT *,
         MAX(number) OVER () max_number,
         ROW_NUMBER() OVER (PARTITION BY number ORDER BY name) rn
  FROM tablename
) t2
WHERE t2.name = t1.name AND t1.number IS NULL;

请参阅demo

万一所有数字都是NULL,改为:

SET number = COALESCE(t2.max_number, 0) + t2.rn

【讨论】:

  • 谢谢!请问这是否是一个有效的解决方案?就我而言,我需要更新 3M 行。
  • @Arman 窗口函数提供比其他方法(如子查询)更好的性能,并且您确实需要自连接来更新表。无论如何,这是您要求的通用解决方案,您可以对其进行测试。
猜你喜欢
  • 2022-12-18
  • 1970-01-01
  • 2022-12-22
  • 1970-01-01
  • 1970-01-01
  • 2013-09-09
  • 1970-01-01
  • 1970-01-01
  • 2014-01-19
相关资源
最近更新 更多