You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 01:17:39