返回正文目录

第二十八章实操:先圈选,再分析

2026-10-25。实际教学 Launcher 0.1.42、项目 CLI 0.1.25,http://127.0.0.1:18067、Namespace chinook-composition、数据源 chinook-composition-sqlite,匿名开发测试,Console/FAP 关闭。进程与 JAR 版本见升级记录。

准备

沿用账单 TM/QM,不新增或修改模型、数据。重新校验模型目录,核对持久绑定,并实时获取 ChinookInvoiceQueryModel 的 JSON / Markdown,确认 customerId、invoiceId、invoiceDate、invoiceAmount。Markdown 由已加载代码实时生成,无须预先维护。

当前会话生成 Compose 请求,使用项目固定 CLI 逐项 validate → preview → execute,保存实际响应、SQL/参数、命令及退出码、请求摘要。未使用私有接口或手写物理 SQL 代替语义查询,未另开干净 AI 会话仅凭教材提示词测试。

请求与结果

脚本 预期与实际
01-customer-totals 按客户汇总 2012 年账单,47 位、477.53
02-top-three-customers 金额降序、客户 ID 升序,前三为 26 / 25.84、34 / 24.77、13 / 24.75
03-top-customers-bills 正文完整请求;三位客户的 7 张账单、75.36,无重复或漏行
04-final-limit-three 仅改最终 limit 为 3,返回原结果排序后的前 3 行,不代表全部账单
05-three-largest-invoices 改问前三张账单,ID 为 299、306、313,所属客户为 26、5、43;与客户 TopN 区分
06-selected-next-year 仍按 2012 年圈选,只改账单分析期为 2013 年;INNER JOIN 返回客户 26 的账单 354、8.91
07-selected-next-year-left 同一跨期问题改 LEFT JOIN,保留三位客户;13、34 的账单字段为空,没有补零
08-empty-selection 圈选增加年度金额至少为 1000 的门槛,无人入选,最终正常返回空列表
09-base-top-three 将排序与 limit 放在基础客户汇总输入,仍返回同一客户集合和 7 张账单;正文统一派生阶段写法
10-recheck-selected-totals 将返回账单再按客户累计,金额与圈选阶段一致;13 / 24.75 / 3 张,26 / 25.84 / 2 张,34 / 24.77 / 2 张

十项均实际通过。正文主请求预览中,客户 CTE 内包含 ORDER BY selection_amount DESC, customer_id ASC LIMIT 3,其后 INNER JOIN 账单,最终外层 LIMIT 100。日期分别绑定到圈选、分析两个输入;跨期请求只改分析输入日期。

独立核对与边界

只读读取 SQLite Invoice 原始 ID、客户、日期和金额,Python 使用 Decimal 汇总年度客户金额,再按金额降序、客户键升序选取前三;独立遍历原始账单构造每个预期列表,逐字段比较客户、账单、日期、金额、顺序和空值。最终结果再次分组核对,避免把排名阶段的合计随明细重复累计。

前三客户为固定三个,未采用并列扩展规则。原始数据日期覆盖 2009-01-01 至 2013-12-22;跨期例子只描述样本内记录,不保证样本外业务完整。空集合请求合法,不放宽门槛以凑结果。所有原始文件、教学模型和数据库摘要保持不变;未验证其他数据库、生产权限、多源或性能结论。

复跑

在资料项目根目录、教学服务运行时执行:

python -X utf8 lab/checks/verify-chapter28-selection.py

最新运行目录 · 验收 · 核对脚本。每轮独立保存证据,0.1.39 的前期备课与第 26、27 章证据保留。