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

如何在PostgreSQL中将单行年度值拆分为多行月度值?

在PostgreSQL中将年度支付记录拆分为月度记录

原表结构

iddateyearly_payment
106/01/21$600
206/01/22$720

期望输出

iddatemonthly_payment
106/01/21$50
107/01/21$50
1...$50
105/01/22$50
206/01/22$60
207/01/22$60
2...$60
205/01/23$60

注:原示例中id=1的最后一条日期应为05/01/22(对应起始日期06/01/21),属于笔误,正确的12个月周期是从起始月开始连续顺延12个月。

解决方案(PostgreSQL)

使用PostgreSQL内置的generate_series函数生成连续月度序列,结合原表数据完成拆分:

SELECT
    t.id,
    -- 生成连续12个月度日期,按指定格式输出
    TO_CHAR(
        (t.date::DATE + (interval '1 month' * s.offset)),
        'MM/DD/YY'
    ) AS date,
    -- 计算月度支付额并还原$格式
    '$' || ROUND((REPLACE(t.yearly_payment, '$', '')::NUMERIC / 12), 2)::TEXT AS monthly_payment
FROM
    your_table_name t
-- 关联0到11的偏移量,为每条年度记录生成12条月度记录
CROSS JOIN generate_series(0, 11) AS s(offset)
ORDER BY t.id, date;

关键逻辑说明

  1. 月度日期生成:
    • generate_series(0,11)生成0到11的整数偏移量,对应12个月的间隔。
    • 将原表的date字段转为DATE类型,叠加对应偏移量的月度间隔,再用TO_CHAR格式化为MM/DD/YY样式。
  2. 月度支付计算:
    • 用REPLACE移除金额字符串中的$,转为数值类型后除以12,通过ROUND保留两位小数,最后拼接$恢复格式。
  3. 记录拆分:
    • CROSS JOIN实现原表记录与12个偏移量的笛卡尔积,直接将单条年度记录扩展为12条月度记录。

适配调整提示

  • 如果原表的date字段已经是DATE类型,可去掉::DATE转换。
  • 若无需保留两位小数,删除ROUND函数即可。

内容的提问来源于stack exchange,提问作者kwarner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 23:50:28