返回正文目录

第十章聚合与计算实操记录

日期:2026-10-19。正文:第十章。先验证请求中的临时计算,再在账单 QM 中新增常用指标 averageAmount;业务数据不变。

环境与恢复

首次调用 capabilities 时 Runtime 未运行,CLI 返回 transport error / WinError 10061,stdout 为空;原始 stderr 和失败命令已保留。采集辅助脚本随后补充空 stdout 的明确报错处理,不将连接失败误报成模型或 JSON 语法问题。

确认 18067 无监听后,按现有发行脚本恢复本教学服务,使用原 runtime/work,不重新初始化数据源或样例。启动记录见 launcher-start.json。当次新 PID 为 86344;wait-ready 第四次探测成功。原命名空间绑定、数据源和账单模型恢复可用。随后按用户要求新增固定指标,过程见下节,无须再次重启服务。

固化指标:先建模,再查询

TM 已提供 invoiceAmount、invoiceId,只修改 ChinookInvoiceQueryModel.qm,在“账单指标”分组增加 averageAmount:formula: 'sum(invoiceAmount) / nullif(count(invoiceId), 0)',类型为 MONEY,说明当前筛选与分组范围、空期间和原始单位。

查询前完成以下操作,公开 CLI 响应保存为 evidence/chapter-10/*-fixed-model-*.json:

  1. 检查能力、自己的 chinook-teaching Bundle、表结构及原查询元数据。
  2. 本版对已注册目录再次执行模型校验会重复加载资源,沿用第八章已确认的处理:只移除自己的 Bundle 登记,校验四个建模文件,通过后重新登记原目录并刷新;不删除源文件或数据。四个文件全部通过校验。
  3. 实时 describe,确认 averageAmount 的 predefined=true、calculated=true、aggregatable=false,用法为 predefined_formula,提示直接在 columns 中引用,不要在 calculatedFields 重定义。
  4. 模型加载成功后,才运行固定指标查询及回归用例。

为避免名称冲突,临时计算改名为 temporaryAverage,公式不变。修改前的八用例清单、基线和验收保存在 query-manifest-before-fixed.json、baseline-before-fixed.json、acceptance-before-fixed.json;原执行响应仍保留。旧 QM 保存为 ChinookInvoiceQueryModel-before.qm,第八章源码链接指向该章版本的独立快照,避免后续指标混入前文。

已执行用例

完整请求位于 queries/chapter-10,每题对应的校验、执行响应见 query-manifest.json。命令日志按执行时点保存为 *-commands.json,响应未覆盖。固定指标加载后,完整复跑 11 个请求,均校验、执行通过。

请求 结果与检查点
01-totals-and-counts.json SUM 金额 477.53;COUNT 账单 83;COUNT_DISTINCT 客户 47,区别于客户表 59 人
02-average.json calculatedFields 定义 temporaryAverage,公式为 sum(invoiceAmount) / nullif(count(invoiceId), 0),均额 5.753373493975904
03-country-share.json 20 个有账单国家;ratio_to_total(totalAmount) 使用已选聚合别名,完整分母 477.53、比例合计 1
04-country-average.json 每个国家的总额、张数与均额逐项核对;20 个国家均额的简单平均为 5.84317142857…,不同于整体 5.753373…
05-share-two-countries.json 在 slice 中限定 USA / Canada,分母 170.55,比例分别为 0.7503957783641161 / 0.2496042216358839
06-share-top-three.json 原全年请求仅 limit 改为 3,前三项占比仍按全年总额计算,与完整结果前 3 行一致。分页明确还有更多行,不将它标成完整国家结果
07-empty-average.json 1990 年无记录,实际返回 items: [{"billCount": 0}],SUM 和均额的空值字段未序列化;不能说均额为 0
08-native-aggregates.json 原生 AVG 与计算均额一致;MIN 为 0.99,MAX 为 23.86
09-predefined-average.json columns 只选 averageAmount,不传公式,返回 5.753373493975904,与临时计算一致
10-predefined-country-average.json 按账单国家分组,20 个固定指标均额与临时计算及原始行核算一致
11-predefined-empty-average.json 空期间返回账单数 0,固定均额字段缺失,与临时计算一致

COUNT_DISTINCT、NULLIF、ratio_to_total 及 QM 预定义聚合公式均经 Runtime 实际验证。temporaryAverage、amountShare 属于本次 payload;averageAmount 属于 QM,不是数据库物理列。

limit: 2 用于整体汇总请求的输出上限,实际一行;它不限制参与聚合的原始账单。本版本满页时会给可能有下一页的提示,Top 3 明确允许部分结果,其余用例检查无后续页。

独立核对与范围

verify-chapter-10.py只读读取原始 Invoice / Customer 行,通过集合去重、字典分组、Decimal 累计和相除,核对计数、临时与固定均额、20 个国家的金额及张数、两种占比分母、Top 3 稳定性和无账单情形。比例与均额的数值误差容许值为 1E-12,不是拿显示两位小数掩盖计算差异。

model-evolution.json记录修改前后哈希和模型校验、describe 响应路径。修改前四文件与第八章验收一致,修改后仅账单 QM 改变,其余三个文件保持原哈希;Chinook 原件与副本仍匹配固定 SHA256。第九章核对脚本已兼容这一已验收模型增量,本轮未重新执行第九章查询。

结果:baseline.json、acceptance.json。通过范围为本地模型增量及 11 个结构化查询;独立自然语言提示词、两路线正确性对比、Console/FAP 与生产权限均未验证。“减少推理复杂度”指请求不再重复组织公式,没有据此声称准确率、Token 或耗时已经量化改善。

复跑

服务关闭时先按 lab 的现有启动说明恢复,并检查 wait-ready。模型就绪后,在 lab 目录运行:

python -X utf8 .\checks\collect-chapter-10.py
python -X utf8 .\checks\verify-chapter-10.py

采集入口复跑 11 个查询,并实时获取能力、绑定、连接与模型说明;查询逐条先校验后执行,不恢复或重建模型。复跑前应已加载包含 averageAmount 的当前 QM;入口不会运行历史 SQL 对照脚本。