返回正文目录

时间比较与 LAG:已验证素材

2026-10-21 从第十一章迁出,供高级篇“时间分析”大章使用,不作为当前基础篇阅读步骤。以下为 Launcher 0.1.25 / CLI 0.1.24 的既有示例;本轮未重新执行。累计与滚动尚待实操,不能沿用这里的通过结论。

依赖第十一章的 ChinookInvoiceTimeQueryModel 及年月字段;LAG 片段中的 totalAmount 来自该章月度汇总的聚合别名。

让引擎计算月度环比

继续发送:

2012 年十一月比十月的账单金额增减多少,比例是多少?

Codex 使用 timeWindow 表达自然月比较。下面返回十月、十一月及各自的上月结果:

{
  "columns": [
    "invoiceDate$year", "invoiceDate$month", "invoiceAmount",
    "invoiceAmount__prior", "invoiceAmount__diff", "invoiceAmount__ratio"
  ],
  "groupBy": ["invoiceDate$year", "invoiceDate$month"],
  "orderBy": ["invoiceDate$year", "invoiceDate$month"],
  "timeWindow": {
    "field": "invoiceDate$id",
    "grain": "month",
    "comparison": "mom",
    "range": "[)",
    "value": ["2012-10-01", "2012-12-01"],
    "targetMetrics": ["invoiceAmount"]
  },
  "limit": 100
}

grain: month 指定自然月,mom 表示与上月比较,targetMetrics 指定指标。本例直接选择 invoiceAmount,引擎按 TM 定义求和,并返回三个派生字段:

字段后缀 含义
__prior 上期金额
__diff 本期金额 − 上期金额
__ratio 差额 ÷ 上期金额

value 配合 [) 限定当前期的展示范围:包含十月、十一月,不包含十二月。引擎还会读取对应上期,因此十月这一行可以拿到九月金额,不需要把九月也显示出来。

先校验再执行,结果如下,金额和百分比仅在展示时舍入:

月份 本期金额 上月金额 差额 环比变化
2012-10 42.62 46.71 −4.09 −8.76%
2012-11 37.62 42.62 −5.00 −11.73%

因此应回答:“2012 年十一月账单金额为 37.62,比十月减少 5.00,下降约 11.73%。”__ratio 返回约 -0.1173,展示为百分数才是 -11.73%。数值由引擎计算,LLM 负责说明结果。

想看同比,可以继续发送:

再看看 2012 年十月、十一月的同比变化。

保持十月、十一月的范围,改用 comparison: yoy,就会对比上年同月。十一月上年同期为 23.76,差额 13.86,同比增长约 58.33%。字段后缀不变,回答时要说清比较对象。

跨年环比也按相邻自然月比较:范围改为 [2011-12-01, 2012-02-01) 时,2012 年一月对比 2011 年十二月,两期都是 37.62,差额与比例均为 0。

补充:LAG 取的是上一行

如果要取有序结果的上一行,可以使用 LAG。在基础篇第十一章的月度查询中,将 previousAmount 加入 columns,并增加以下配置:

{
  "calculatedFields": [
    {
      "name": "previousAmount",
      "expression": "lag(totalAmount, 1)",
      "windowOrderBy": [{"field": "invoiceDate$yearMonth", "dir": "asc"}]
    }
  ]
}

这里先汇总得到 totalAmount,再按 windowOrderBy 的年月顺序取上一行金额。十一月得到十月的 42.62;查询只包含 2012 年,一月前面没有结果行,因此为空,不会额外读取去年十二月。

上一行不一定是上个月。 假如中间缺了一个月份,LAG 会取更早的那一行;明确比较自然月时,本章优先使用 timeWindow。月份缺口也不能不问业务含义就补零。

这个接口不支持 lag(sum(invoiceAmount), 1) 的嵌套写法。校验返回 WINDOW_NESTED_AGGREGATE_UNSUPPORTED,定位到 calculatedFields[0].expression,建议先给汇总列起别名,再用 lag(totalAmount, 1)。修改后重新校验,别让 AI 反复撞同一堵墙。

原有证据与后续写作

既有复测覆盖月度汇总、环比、同比、跨年、缺上期、空期间与 LAG,并记录嵌套聚合校验拒绝。完整范围以0.1.25 实操记录为准;初轮记录、查询文件、日志及模型保持原样。

高级篇写作时再核对当时版本及模型,补累计和滚动的独立基线,统一讲当前期、比较期、累计起点、窗口宽度、缺月与零值。迁移不等于这些新增范围已经验证。