使用详细信息级别(LOD)表达式可以指定聚合计算时的粒度,且该粒度独立于查询中的字段。 本页介绍如何在指标视图中使用 LOD 表达式。
什么是详细表达式级别?
明细级别表达式让您能够精确指定在计算聚合结果时使用哪些字段,而不受查询中现有字段的影响。 这样就可以对计算范围进行精细控制。
详细信息表达式有两种类型的级别:
- 固定详细级别:按表达式本身中指定的预定义字段集进行聚合,忽略查询中的其他字段。
- 较粗的详细程度:通过在分组时排除特定字段,按比查询更粗的粒度进行聚合。
固定的详细信息级别
固定级别的详细信息表达式以定义的粒度计算聚合,忽略查询中的字段。 在指标视图中,固定 LOD 表达式直接定义在列定义的 expr 字段中,并使用带有 PARTITION BY 子句的 SQL 窗口函数。
何时使用固定级别的详细信息
需要满足以下条件时,请使用固定级别的详细信息表达式:
- 不依赖于查询分组:具有跨所有用途的静态分区的指标。
- 数据集级聚合:与行级别分组相比的全局聚合(例如,按优先级计算总销售额的百分比)。
- 多级层次:在同一视图中可以查看到详细级别和汇总级别的度量。
Syntax
固定 LOD 表达式使用 SQL 窗口函数 在定义的粒度上计算聚合。 将窗口函数直接放在字段定义中的 expr 字段中:
fields:
- name: <lod_name>
expr: <AGGREGATE_FUNCTION>(<column>) OVER (PARTITION BY <dim1>, <dim2>, ...)
若要聚合整个数据集,请忽略 PARTITION BY 条件,并在 OVER 后留空括号。
示例:按订单优先级统计的总销售额
假设你想要定义一个指标视图,其中每个订单的销售量与其优先级组的总销售额进行比较。 以下示例在源查询中计算 priority_total_price ,并将其公开为标识字段:
version: 1.1
source: samples.tpch.orders
fields:
- name: order_priority
expr: o_orderpriority
- name: order_date
expr: o_orderdate
- name: priority_total_price
expr: SUM(o_totalprice) OVER (PARTITION BY o_orderpriority)
measures:
- name: total_sales
expr: SUM(o_totalprice)
- name: pct_of_priority_total
expr: SUM(o_totalprice) / ANY_VALUE(priority_total_price)
priority_total_price 字段直接在其 expr 字段中定义每个优先级组的固定总计。 该 pct_of_priority_total 度量将单个订单销售额除以一个固定的总数以生成百分比,无论查询如何对结果进行分组。
注释
在度量值表达式中引用固定级别的详细信息字段时,将其包装在聚合函数中。 当值在组中为常量时使用 ANY_VALUE ,如前面的示例所示。
对固定级别的详细信息表达式进行筛选
在应用任何查询时筛选器之前,将计算详细表达式的固定级别。 若要将筛选器应用于固定 LOD 计算,请使用 CASE 语句或 FILTER 子句,在窗口函数表达式中包含筛选条件。
更粗略的详细信息级别
较粗粒度的详细信息级别表达式通过从分区中排除一个或多个字段,以比查询更粗的粒度进行聚合。 在指标视图中,粗略的 LOD 表达式是使用有范围规范的 窗口度量 实现的 all 。
重要
窗口度量值是 实验性的。
何时使用更粗糙的详细信息级别
如果需要,请使用更粗细的详细信息表达式级别:
- 动态分组:适应查询分组的聚合(例如,任何选定字段的总计百分比)。
- 筛选器感知聚合:在考虑查询时的筛选器范围内,以较粗粒度进行计算。
Syntax
对于要从分区中排除的每个字段,请使用 range: all 定义一个窗口度量:
measures:
- name: <measure_name>
expr: <AGGREGATE_EXPRESSION>
window:
- order: <field_to_exclude>
range: all
semiadditive: last
若要排除多个字段,请将条目添加到每个字段的 window 数组中。
示例:总销售额的百分比
计算每个订单优先级的总销售额百分比:
version: 1.1
source: samples.tpch.orders
fields:
- name: order_priority
expr: o_orderpriority
measures:
- name: total_sales
expr: SUM(o_totalprice)
- name: all_priorities_sales
expr: SUM(o_totalprice)
window:
- order: order_priority
range: all
semiadditive: last
- name: pct_of_total_sales
expr: SUM(o_totalprice) / MEASURE(all_priorities_sales)
在本示例中:
-
total_sales聚合在查询的分组级别。 -
all_priorities_sales使用range: all来计算所有订单优先级的总数,并忽略查询中的order_priority字段。 -
pct_of_total_sales将优先级级别的销售额除以总计以生成百分比。
其他资源
- 窗口测量:度量视图中用于表达低精度详情级别的基础机制。
- Unity 目录指标视图:指标视图组件和建模模式概述。
- 详细信息级别(LOD)表达式:AI/BI 仪表板中的 LOD 表达式。