定义:写进指标契约
查询:只约束本次计划
展示:只决定返回哪些成员
交集:查询不能放宽定义
比率:分子与分母可分别过滤
同一个谓词放在不同层,约束的对象不同
同一个“华东”条件,放在指标定义里和放在本次查询里,结果可以不同。指标级过滤是该指标契约的一部分,在这个指标聚合之前生效,查询不能把它放宽。查询级过滤只属于这一次计划,与指标过滤取交集。维度上的条件还要再区分:它是在聚合前限制事实行,还是只决定结果里显示哪些成员。
因此不能把任意位置的“区域等于华东”当成同一个开关。要先写清它改的是指标定义、本次约束,还是结果投影。未声明层级时,引擎不应自行选择,因为可加合计、比率和多指标对齐会走出不同的数字。把条件从指标定义挪到查询,或从查询挪到展示,都应视为一次新的计算,并在结果旁标出谓词层级。
指标级过滤写在定义里,聚合前生效
指标级过滤始终带在该指标上。例如“华东销售额”的定义包含区域等于华东;用户即使询问全国,这个指标也不会把其他区域加进来。过滤作用在进入该指标聚合的事实行上,而不是在全国总数算完之后再扣减。要看全国销售额,应使用没有该过滤的另一个指标。定义过滤被放宽,等于把另一个指标的结果冒充成原指标。
dbt 允许为指标配置过滤。比率指标还可以把过滤同时加在分子和分母上,或只加在其中一方。衍生指标的每个输入也可以各自带过滤。所以“华东”若只写在分子上,分母仍可以是未过滤口径。把同一字符串复制到查询条件,并不能自动得到这种结构。若衍生指标没有声明查询条件作用在哪一侧,执行应失败并要求补声明,而不能默认作用在全部输入上。
查询级过滤只改这一次计划
查询级过滤来自这一次问题、报表切片或接口参数,不写回指标定义。下一次不带该条件的查询仍使用原指标。它与定义过滤同时成立时取交集:指标已限定华东,本次又限定华北,有效行集为空,结果应是空或按声明归零,而不是把两个区域并起来。交集是逻辑与,不是先后覆盖。后写入的查询条件不能擦掉定义里已经声明的区域。
查询过滤要在每个相关基础指标聚合之前下推。一次取出“销售额”和“华东销售额”时,本次区域条件应分别进入两个聚合。先在全国粒度算完再在最外层过滤,会让比率和跨事实对齐用到已经混在一起的中间结果。跨事实表时,这个约束要进到各自聚合内部,再按行标题对齐,而不是只滤对齐后的宽表。下推之后,每个聚合节点的谓词都应能单独读出,而不是只在最终结果里出现一次。
维度过滤要声明是约束还是展示
维度过滤有两种用法。约束型写进聚合前的谓词,改变度量,和查询级过滤同类。展示型只限制返回哪些维度成员,不改变已经算完的度量。总计若在展示过滤之前算出,仍可能包含被隐藏的成员。用户期望数字变化时,必须把条件当作约束,而不能只把它当作图例筛选。约束过滤改变进入聚合的行,展示过滤改变离开结果的行。两者的行数变化发生在计划的不同节点。
优先级可以收成三条。其一,定义过滤始终生效,查询不能用更宽的范围覆盖它。其二,查询级约束与定义过滤取交集,并在各指标聚合前应用。其三,展示过滤不参与度量计算;它与约束冲突时,以约束后的聚合为准,再决定显示哪些成员。过滤还会改变进入聚合的行集,所以应和粒度一起声明,避免同一指标在不同行集上被当成同一个度量。
虚构例子:华东放进比率的哪一侧
以下数字只是例子。销售有三行:华东 100、华东 50、华北 80,合计 230。指标“销售额”无定义过滤;指标“华东销售额”的定义过滤是区域等于华东,结果为 150。比率“华东占比”若分子带华东过滤、分母不过滤,结果是 150/230。
若本次查询把“华东”作为查询级约束,并声明对比率的分子和分母都生效,则销售额变成 150,华东销售额仍是 150,占比变成 150/150。同一个词从分子定义挪到整次查询后,占比从部分变成全部。若该条件只是展示过滤,分母仍按全国聚合,占比可以仍是 150/230,但结果里只显示华东。两种计划都自洽,混用就会对不上。150/150 与 150/230 都可以被叫作华东占比,只有计划写明分母是否吃到查询条件,复核时才能判断哪一个是本次要的数。
外层一个条件,或按指标下推
路径一是把所有条件收成最外层的一个筛选。实现短,单个可加合计有时看起来也正确。它无法表达“只过滤分子”,无法阻止查询放宽指标定义,也不能区分展示过滤和约束过滤。多指标查询会共用一个谓词,比率被一并改写。外层筛选若在跨事实对齐之后才生效,一侧的过滤还会缩小另一侧本应独立聚合的度量。
路径二按指标编译谓词。每个基础指标的有效条件是定义过滤与本次约束的交集,下推到该指标自己的聚合;衍生指标显式声明查询约束作用于全部输入、仅分子或仅分母。展示过滤留在对齐之后的投影。语义模型分开描述度量与维度,指标过滤再引用维度,适合作为这种计划的来源,但仍要检查生成语句里谓词的位置。路径二的计划更长,验收必须看每个聚合节点,不能只比对一个单元格。
反例与验收
反例一:把华东写进指标,标签仍叫销售额,全国问题返回区域数字。反例二:查询条件华北与指标条件华东取并集,得到两个区域的和。反例三:外层过滤在连接之后才生效,分母已被分子的行集缩小,占比变成全部。反例四:展示过滤隐藏了华北,总计仍含华北,图和总计对不上,却没有谓词说明差异。
验收用同一组例子分别跑:定义过滤、查询约束、两者交集、只过滤分子的比率、双方都过滤的比率、展示过滤不改变已计算的总计。交集为空时结果为空或按声明归零,不能回退成未过滤。连续两次查询,第二次不带华东时不得沿用第一次的查询条件。计划文本应标出每个谓词是定义级、查询级还是展示级。还要检查比率的分子合计与分母合计是否分别等于对应基础指标,而不是只检查一个百分比。
BuildTable.ai 边界
先把“华东”做成三种可区分的计划,用上面的三行例子核对销售额、华东销售额和占比,再接到真实区域维度上。区域重命名、未知成员和同一属性的多个键要单独测,避免同字不同键。跨事实指标还要确认约束被下推到各自聚合,而不是只出现在最终投影里。
BuildTable.ai 可作为语义建模入口候选。本文不证明当前版本已经实现指标过滤、查询过滤和展示过滤的优先级,也不证明已经实现跨事实先聚合对齐或语义版本钉住。要以实际模型、查询计划和验收样例核验每个谓词被放在哪一层。
