PostgreSQL中同表内单元格值跨行列复制方法求助
PostgreSQL 同表填充两个月前的价格
方法1:使用窗口函数 LAG()(适用于每月数据连续的场景)
如果你的数据是每个产品每月都有一条记录(如示例所示),可以用LAG()窗口函数直接获取前两行的price值,刚好对应两个月前的数据。
查询验证结果
SELECT id, date, product, price, LAG(price, 2) OVER (PARTITION BY product ORDER BY date) AS "price 2 mos earlier" FROM your_table_name;
该语句按product分组、date升序排序,取当前行往前数第2行的price值,匹配两个月前的价格。
更新表中已创建的列
若要将结果写入已创建的price 2 mos earlier列,可结合CTE和UPDATE实现:
WITH lagged_prices AS ( SELECT id, LAG(price, 2) OVER (PARTITION BY product ORDER BY date) AS lag_price FROM your_table_name ) UPDATE your_table_name t SET "price 2 mos earlier" = lp.lag_price FROM lagged_prices lp WHERE t.id = lp.id;
方法2:自连接(适用于日期不连续的场景)
如果数据存在月份缺失,用日期计算匹配两个月前的记录更准确,直接通过date - interval '2 months'关联对应行:
查询验证结果
SELECT t1.id, t1.date, t1.product, t1.price, t2.price AS "price 2 mos earlier" FROM your_table_name t1 LEFT JOIN your_table_name t2 ON t1.product = t2.product AND t1.date = t2.date + INTERVAL '2 months';
使用LEFT JOIN确保无匹配记录时,对应位置显示为空,符合需求。
更新表中已创建的列
将查询结果写入目标列:
UPDATE your_table_name t1 SET "price 2 mos earlier" = t2.price FROM your_table_name t2 WHERE t1.product = t2.product AND t1.date = t2.date + INTERVAL '2 months';
注意事项
- 替换语句中的
your_table_name为实际表名 - 带空格的列名需用双引号包裹(如
"price 2 mos earlier"),PostgreSQL对这类标识符有强制要求 - 若日期字段为
timestamp类型,语句逻辑完全适用,无需调整
内容的提问来源于stack exchange,提问作者BrandON
相关产品推荐
相关产品推荐

