Commit Graph

3 Commits

Author SHA1 Message Date
ThearchyHelios 9627953445 差异说明认得一边套了 ROUND:说「X 套了 ROUND(…, 2):保留 2 位小数,另一边没有取整」,只陈述写法、不断言值不同,判等价照旧不等价;零售样例题集的期望 SQL 去掉 ROUND(…, 2)(取整交给展示,评分本来按容差比数),评测逐题比 SQL 不再因为期望里的取整一律对不上 2026-10-17 13:31:25 +08:00
ThearchyHelios 39b89fd36b 差异说明在投影之后也说得清:COALESCE 套聚合、按当天现算的日期、取不到参数
逐格投影之后两边只剩一列,差别常常就在这一列的写法上,以前照样整段兜底。只改说明,判定一个不变(这几种本来就不等价):

- _Explainer._coalesced:同一位置上一边是 COALESCE(聚合, 常量)(IFNULL 也读成它)、另一边就是那个聚合,说「这次的销售额
  套了 COALESCE(…, 0):没有符合条件的行、或者 amount 都为空时这次是 0、口径是空」;参数那一列表结构里一定不为空时只说
  「没有符合条件的行时」;分组时说「某一组的 amount 都为空时」,参数一定不为空时两边一样、不说。只认会得出空值的
  SUM / AVG / MIN / MAX,COUNT 套 COALESCE 两边其实一样,不说成不同。列名从原文取(规范形式去掉了外层别名)。
- _Explainer._relative:同一列上一边按运行当天现算(CURRENT_DATE、now()、SQLite 的 date('now', …),_now_based)、另一边写定
  的常量,说「这次对 paid_date 的条件是 …,按运行当天现算(换一天运行,范围随之改变);口径写定的是 …」,要求同 _rewrites。
- match_template:口径有入口字段取不到值、又没有缺省值时,以前拿空值渲染出「paid_date >= ''」去比,说明里就出现不存在的
  写法;改成一律说取不到参数,这次在那里写的是现算日期的逐个说清(_now_slots 按列和比较的方向认,只是说明)。解析不了的
  照旧只说解析不了。评测逐题比 SQL 用的是同一个函数,跟着说得清。

测试:tests/test_ledger_cells.py 新增三条(COALESCE 那一格仍然不等价、说明先说多查了几列再说 COALESCE;在虚构库上没有行时
两边确实不同,COUNT 套 COALESCE 不说成不同;按当天现算的日期逐格比时说清取不到参数、和写定日期的 SQL 直接比时说清一边现算
一边写定)。去掉这三处再跑,三条失败;判等价的语料和执行守门照旧全过。
2026-10-17 13:09:55 +08:00
ThearchyHelios 271bc6e782 口径标签逐格判:引用了好几列的查询,每个数按它自己那一格标
真实模型下问「上周的销售额是多少」,助手写 SUM(amount) AS 销售额, COUNT(*) AS 订单数, MIN / MAX(paid_date) AS 区间首日 /
末日,报告四列都引用了,口径「周销售」只取 SUM(amount)。按「全部引用列」投影后还是 4 列,对不上口径的 1 列,整条比、
四个数都标相关口径,说明整段兜底。

- ledger/match._cells / _cell(algo 4):整条(含按全部引用列投影)没证明、又引用了这条查询两列以上的,被引用的每一列单独
  投影到那一列,和每份口径的每个指标读的那一列(card_reads;口径版本没有口径卡的按取数的每一列)逐个比,仍只走
  match_template / explain_sql_diff,上次的投影规则照用:投影不了(分组列、DISTINCT……)、过了时限、不可比的格照用整条
  查询的那一个候选。结果记在 queries[].cells {列名: {status, candidates}},另记 one_row(sql_semantics.one_row:不分组的
  聚合,一定只出一行)。整条这一层的结论、候选一字不改;老工件没有 cells,照旧按整条读。
- ledger/labels:单元格按它那一格的结论标(_view);指标用了同一条查询的好几格时,只有那条查询一定只出一行才把逐格的
  结论合起来用(多行的结果里每一列各自对得上,不等于每一行的几列一起对得上)。整题照拍板 L1 不变:每个数都证明来自
  同一份口径才等价;一格证明了、别的格只是相关的整题不等价,原因写「有的数和相关口径不一致,不来自口径」(以前一律说
  「这次的推理」)。出具入口照 ledger/issue 现有判法只在整题等价时给,没有放宽。
- 逐格证明了的口径各处都算上(labels.candidates_of):工件 meta 的 calibers(召回按旧版本反查)、ledger/uses 的使用记录、
  召回时找原答案对应的那一格、E4;E1 另数各种结论各几格(cells),E2 的兜底比例按标签上给人看的那一份说明数。
- GET /runs/{id}/ledger 的 queries 带上逐格的 cells(遮罩同候选);证据片段的 ledger 键、轮次摘要的计数本来就按每个数的
  标签,数据变了、形状不变。前端只补类型;check-ledger 加一段:同一条查询一格来自口径(正文挂小标记)、一格相关(差在哪
  先说多查了几列),整题不等价不给出具。
- 评测逐题比 SQL(eval/score.sql_match)取和期望配上的那一格(score.matched_cells:评分时配上的格),没给时取逐格证明了
  的那一格;结果带 column。runner、rescore 传它。

测试:tests/test_ledger_cells.py(同一条查询一列等价、一列不等价各自标对;两份口径只证明了一份标那一份;口径多个指标按列
配对;指标跨两格只在一行的查询上用逐格结论;分组列、DISTINCT 逐格也不投影;照真实例子造的虚构库真跑一遍:销售额标等价
已证明,订单数、首末日标相关,整题不等价、不给出具、不自动出具,证据片段的 ledger 键一致;评测取配上的那一格)。去掉逐格
再跑,10 条失败;去掉「一行才合起来用」、去掉评测取格,各 1 条失败。
2026-10-17 13:07:19 +08:00