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

使用Oracle Model Clause实现按年新增年末记录到结果集

基于Oracle Model Clause的实现方案

假设你的源表名为t,包含d(DATE类型)、v(NUMBER类型)两个字段,实现SQL如下:

SELECT d, v
FROM t
MODEL
  PARTITION BY (EXTRACT(YEAR FROM d) AS yr) -- 按年份拆分数据独立处理
  DIMENSION BY (ROW_NUMBER() OVER(PARTITION BY EXTRACT(YEAR FROM d) ORDER BY d) AS rn) -- 同一年内按日期升序生成序号
  MEASURES (d, v, 0 AS is_new) -- 定义度量:原日期、原V值、新增行标记
  RULES UPSERT (
    -- 为每个年份插入新行,序号为当年最大序号+1
    d[rn = MAX(rn)[ANY] + 1] = TO_DATE(yr || '-12-31', 'yyyy-mm-dd'),
    v[rn = MAX(rn)[ANY] + 1] = v[MAX(rn)[ANY]], -- 取当年最后一条已有记录的V值
    is_new[rn = MAX(rn)[ANY] + 1] = 1
  )
ORDER BY d;

如果需要完全匹配你给出的带<<标记的输出格式,可以调整查询字段的拼接逻辑:

SELECT TO_CHAR(d, 'yyyy-mm-dd') || ', ' || v || CASE WHEN is_new = 1 THEN ' <<' ELSE '' END AS output_str
FROM t
MODEL
  PARTITION BY (EXTRACT(YEAR FROM d) AS yr)
  DIMENSION BY (ROW_NUMBER() OVER(PARTITION BY EXTRACT(YEAR FROM d) ORDER BY d) AS rn)
  MEASURES (d, v, 0 AS is_new)
  RULES UPSERT (
    d[rn = MAX(rn)[ANY] + 1] = TO_DATE(yr || '-12-31', 'yyyy-mm-dd'),
    v[rn = MAX(rn)[ANY] + 1] = v[MAX(rn)[ANY]],
    is_new[rn = MAX(rn)[ANY] + 1] = 1
  )
ORDER BY d;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 12:06:06