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

如何在PostgreSQL中为每组车型与城市生成24个月周期的自增数据

在PostgreSQL中生成每个车辆-城市组合的24个月周期数据

嘿,这个需求实现起来很简单,核心就是先拿到所有唯一的car+city组合,再给每个组合生成1到24的连续月份数。下面给你两种实用的方案:

方案一:使用generate_series + CROSS JOIN(推荐)

这是最直接高效的方式,完美匹配你的需求:

SELECT 
    t.car,
    t.city,
    s.month_number
FROM (
    -- 先获取所有不重复的车辆和城市组合
    SELECT DISTINCT car, city 
    FROM db_table
) t
-- 交叉连接生成1到24的连续月份
CROSS JOIN generate_series(1, 24) AS s(month_number)
-- 按需求排序结果
ORDER BY t.car, t.city, s.month_number;

代码解释:

  • 子查询(SELECT DISTINCT car, city FROM db_table):从原表中提取所有唯一的车辆-城市配对,避免重复生成相同组合的数据。
  • generate_series(1, 24):PostgreSQL内置的序列生成函数,直接生成1到24的连续整数,作为我们需要的month_number。
  • CROSS JOIN:将每个车辆-城市组合和每个月份进行配对,这样每个组合都会得到24条连续月份的数据。
  • 最后的ORDER BY确保结果按车辆、城市、月份排序,和你期望的输出格式完全一致。

方案二:如果需要关联原表已有数据(可选)

如果你希望保留原表中已有的其他字段(比如原表有额外属性需要同步),可以用LEFT JOIN关联原表,但如果只是单纯生成24个月的序列,方案一足够简洁:

SELECT 
    t.car,
    t.city,
    s.month_number,
    -- 用COALESCE处理原表缺失月份时的默认值
    COALESCE(original.other_column, 'default_value') AS other_column
FROM (
    SELECT DISTINCT car, city 
    FROM db_table
) t
CROSS JOIN generate_series(1, 24) AS s(month_number)
LEFT JOIN db_table original 
    ON t.car = original.car 
    AND t.city = original.city 
    AND s.month_number = original.month_number
ORDER BY t.car, t.city, s.month_number;

这个方案适合需要补充原表缺失月份数据的场景,能保留原表已有的字段值,同时补全缺失的月份记录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 17:02:43