在指标视图中使用详细信息级别(LOD)表达式

详细信息级别(LOD)表达式允许您指定聚合计算的粒度,这些计算的粒度独立于查询中的维度。 本页介绍如何在指标视图中使用 LOD 表达式。

什么是详细表达式级别?

通过详细级别表达式,您可以精确指定进行计算聚合时要使用的维度,而不考虑查询中存在的维度。 这样就可以对计算范围进行精细控制。

详细信息表达式有两种类型的级别:

  • 固定的详细信息级别:聚合表达式本身中指定的预定义维度集,忽略查询中的其他维度。
  • 较粗的细节层次:通过在分组中排除特定维度,按照比查询更粗的粒度进行聚合。

固定的详细信息级别

固定级别的详细信息表达式以定义的粒度计算聚合,忽略查询中的维度。 在指标视图中,固定的 LOD 表达式是通过 SQL 窗口函数在 PARTITION BY 查询中的 source 子句实现的。 然后,将预计算结果呈现为身份维度。

何时使用固定级别的详细信息

需要满足以下条件时,请使用固定级别的详细信息表达式:

  • 不依赖于查询分组:具有跨所有用途的静态分区的指标。
  • 数据集级聚合:与行级别分组相比的全局聚合(例如,按优先级计算总销售额的百分比)。
  • 多级层次:在同一视图中可以查看到详细级别和汇总级别的度量。

Syntax

固定 LOD 表达式使用 SQL 窗口函数 在定义的粒度上计算聚合。

  1. 在查询中包含 source 窗口函数:

    SELECT ..., <AGGREGATE_FUNCTION>(<column>) OVER (PARTITION BY <dim1>, <dim2>, ...) AS <lod_name>
    FROM <table>
    

    若要聚合整个数据集,请忽略 PARTITION BY 条件,并在 OVER 后留空括号。

  2. 将预计算列公开为标识维度,其中nameexpr均为列名。

    dimensions:
      - name: <lod_name>
        expr: <lod_name>
    

示例:按订单优先级统计的总销售额

假设你想要定义一个指标视图,其中每个订单的销售量与其优先级组的总销售额进行比较。 以下示例在源查询中计算 priority_total_price ,并将其公开为标识维度:

version: 1.1

source: |
  SELECT
    o_orderkey,
    o_orderpriority,
    o_totalprice,
    o_orderdate,
    SUM(o_totalprice) OVER (PARTITION BY o_orderpriority) AS priority_total_price
  FROM samples.tpch.orders

dimensions:
  - name: order_priority
    expr: o_orderpriority
  - name: order_date
    expr: o_orderdate
  - name: priority_total_price
    expr: priority_total_price

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标识维度保存每个优先级组的固定总计。 该 pct_of_priority_total 度量将单个订单销售额除以一个固定的总数以生成百分比,无论查询如何对结果进行分组。

注释

在度量值表达式中引用固定级别的详细信息维度时,将其包装在聚合函数中。 当值在组中为常量时使用 ANY_VALUE ,如前面的示例所示。

对固定级别的详细信息表达式进行筛选

在应用任何查询时间筛选器之前, source 会在查询中计算详细表达式的固定级别。 若要将筛选器应用于固定 LOD 计算,请在查询本身中包含 source 筛选器条件。

更粗略的详细信息级别

通过排除分区中的一个或多个维度,以更大粒度聚合详细层次。 在指标视图中,粗略的 LOD 表达式是使用有范围规范的 窗口度量 实现的 all

重要

窗口度量值是 实验性的

何时使用更粗糙的详细信息级别

如果需要,请使用更粗细的详细信息表达式级别:

  • 动态分组:适应查询分组的聚合(例如,任何所选维度的总计百分比)。
  • 筛选器感知聚合:在考虑查询时的筛选器范围内,以较粗粒度进行计算。

Syntax

对于要从分区中排除的每个维度,请使用以下命令定义窗口度量值 range: all

measures:
  - name: <measure_name>
    expr: <AGGREGATE_EXPRESSION>
    window:
      - order: <dimension_to_exclude>
        range: all
        semiadditive: last

若要排除多个维度,请将条目添加到每个维度的 window 数组中。

示例:总销售额的百分比

计算每个订单优先级的总销售额百分比:

version: 1.1

source: samples.tpch.orders

dimensions:
  - 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 将优先级级别的销售额除以总计以生成百分比。

其他资源