测量类型

本页指的是属于衡量指标type 参数。

type 还可以用作维度、过滤条件和参数类型文档页面中所述的维度过滤条件的一部分。

type 还可以用作维度组的一部分,如 dimension_group 参数文档页面中所述。

用法

view: view_name {
  measure: field_name {
    type: measure_field_type
  }
}
层次结构
type
可能的字段类型
测量

接受
一种衡量类型

本页详细介绍了可分配给指标的各种类型。一个指标只能有一个类型,如果未指定类型,则默认为 string

某些衡量类型具有支持参数,这些参数将在相应部分中进行说明。

衡量类型类别

每种衡量类型都属于以下类别之一。这些类别决定了度量类型是否执行聚合、度量类型可以引用的字段类型,以及您是否可以使用 filters 参数过滤度量类型:

  • 汇总度量:汇总度量类型会执行聚合,例如 sumaverage。汇总度量只能引用维度,而不能引用其他度量。这是唯一可与 filters 参数搭配使用的衡量指标类型。
  • 非汇总型衡量指标:顾名思义,非汇总型衡量指标是指不执行汇总的衡量指标类型,例如 numberyesno。这些衡量类型会执行基本转换,并且由于它们不执行汇总,因此只能引用汇总衡量或之前汇总的维度。您无法将 filters 参数与这些衡量类型搭配使用。
  • Post-SQL 度量:Post-SQL 度量是一种特殊的度量类型,可在 Looker 生成查询 SQL 后执行特定计算。它们只能引用数值指标或数值维度。您无法将 filters 参数与这些衡量类型搭配使用。

类型定义列表

类型 类别 说明
average 汇总 生成列中值的平均值
average_distinct 汇总 在使用非规范化数据时,正确生成值的平均值(平均数)。如需查看完整说明,请参阅 average_distinct 部分。
count 汇总 生成行数
count_distinct 汇总 生成列中唯一值的数量
date 非汇总 对于包含日期的指标
list 汇总 生成列中唯一值的列表
max 汇总 生成列中的最大值
median 汇总 生成列中值的中间值(中点值)
median_distinct 汇总 当联接导致扇出时,正确生成值的中间值(中点值)。如需查看完整说明,请参阅 median_distinct 部分。
min 汇总 生成列中的最小值
number 非汇总 对于包含数字的指标
percent_of_previous Post-SQL 生成所显示行之间的百分比差异
percent_of_total Post-SQL 为显示的每行生成占总数的百分比
percentile 汇总 生成列中指定百分位处的值
percentile_distinct 汇总 当联接导致扇出时,正确生成指定百分位的值。如需查看完整说明,请参阅 percentile_distinct 部分。
running_total Post-SQL 为每个显示的行生成累计总数
period_over_period 汇总 引用了较早时间段的汇总
string 非汇总 对于包含字母或特殊字符的衡量指标(例如 MySQL 的 GROUP_CONCAT 函数)
sum 汇总 生成列中值的总和
sum_distinct 汇总 在使用非规范化数据时,正确生成值总和。

如需查看完整说明,请参阅 sum_distinct 部分。
yesno 非汇总 对于将显示 true 或 false 的字段
int 非汇总 移除了 5.4 已替换为 type: number

average

type: average 用于计算指定字段中值的平均值。它类似于 SQL 的 AVG 函数。不过,与原始 SQL 不同的是,即使查询的联接包含扇出,Looker 也会正确计算平均值。

type: average 衡量指标的 sql 参数可以采用任何有效的 SQL 表达式,该表达式会生成数值表列、LookML 维度或 LookML 维度的组合。

可以使用 value_formatvalue_format_name 参数设置 type: average 字段的格式。

例如,以下 LookML 通过对 sales_price 维度求平均值来创建名为 avg_order 的字段,然后以货币格式(1,234.56 美元)显示该字段:

measure: avg_order {
  type: average
  sql: ${sales_price} ;;
  value_format_name: usd
}

average_distinct

type: average_distinct 适用于非规范化数据集。它会根据 sql_distinct_key 参数定义的唯一值,计算指定字段中非重复值的平均值。

这是一个高级概念,通过示例可以更清楚地说明。假设有一个如下所示的非规范化表:

订单项 ID 订单 ID 订单配送
1 1 10.00
2 1 10.00
3 2 20.00
4 2 20.00
5 2 20.00

在这种情况下,您可以看到每个订单都有多行。因此,如果您为 order_shipping 列添加一个基本的 type: average 指标,您会得到 16.00 的值,即使实际平均值为 15.00 也是如此。

 # Will NOT calculate the correct average
measure: avg_shipping {
  type: average
  sql: ${order_shipping} ;;
}

为了获得准确的结果,您可以使用 sql_distinct_key 参数为 Looker 定义应如何识别每个唯一实体(在本例中为每个唯一订单)。此函数计算出正确的 15.00 金额:

 # Will calculate the correct average
measure: avg_shipping {
  type: average_distinct
  sql_distinct_key: ${order_id} ;;
  sql: ${order_shipping} ;;
}

sql_distinct_key 的每个唯一值在 sql 中都必须只有一个对应的值。换句话说,上述示例之所以有效,是因为 每个 order_id 为 1 的行都具有相同的 order_shipping 值 10.00,并且每个 order_id 为 2 的行都具有相同的 order_shipping 值 20.00。

可以使用 value_formatvalue_format_name 参数设置 type: average_distinct 字段的格式。

count

type: count 执行表计数,类似于 SQL 的 COUNT 函数。不过,与原始 SQL 不同的是,即使查询的联接包含扇出,Looker 也会正确计算数量。

type: count 指标会根据表的主键执行表计数,因此 type: count 指标不支持 sql 参数。

如果您想对表的主键以外的字段执行表计数,请使用 type: count_distinct 度量。或者,如果您不想使用 count_distinct,可以使用 type: number 指标(如需了解详情,请参阅社区帖子如何统计非主键)。

例如,以下 LookML 会创建一个字段 number_of_products

view: products {
  measure: number_of_products {
    type: count
    drill_fields: [product_details*]  # optional
  }
}

定义 type: count 度量时,通常会提供 drill_fields(针对字段)参数,以便用户在点击该度量时,能够看到构成相应计数的各个记录。

如果您在探索中使用 type: count度量,可视化图表会使用视图名称而非“数量”一词来标记结果值。为避免混淆,我们建议您将视图名称改为复数形式,在图表设置的序列下选择显示完整字段名称,或使用包含视图名称复数形式的 view_label

您可以使用 filters 参数为 type: count 的衡量指标添加过滤条件。

count_distinct

type: count_distinct 用于计算给定字段中不同值的数量,它使用 SQL 的 COUNT DISTINCT 函数。

type: count_distinct 度量的 sql 参数可以采用任何有效的 SQL 表达式,该表达式会生成一个表列、LookML 维度或 LookML 维度的组合。

例如,以下 LookML 会创建一个用于统计唯一客户 ID 数量的字段 number_of_unique_customers

measure: number_of_unique_customers {
  type: count_distinct
  sql: ${customer_id} ;;
}

您可以使用 filters 参数为 type: count_distinct 的衡量指标添加过滤条件。

date

type: date 与包含日期的字段搭配使用。

type: date 指标的 sql 参数可以采用任何可生成日期的有效 SQL 表达式。实际上,这种类型很少使用,因为大多数 SQL 聚合函数不会返回日期。一种常见的例外情况是日期维度的 MINMAX

使用 type: date 创建最大日期或最小日期度量

如果您想创建最大日期或最小日期的度量,最初可能会认为使用 type: maxtype: min 的度量即可。不过,这些衡量类型仅与数值字段兼容。您可以改为定义 type: date 的度量,并将 sql 参数中引用的日期字段封装在 MIN()MAX() 函数中,从而捕获最晚日期或最早日期。

假设您有一个维度组,其维度数为 type: time,名称为 updated

dimension_group: updated {
  type: time
  timeframes: [time, date, week, month, raw]
  sql: ${TABLE}.updated_at ;;
}

您可以创建 type: date 的度量,以捕获相应维度组的最大日期,如下所示:

measure: last_updated_date {
  type: date
  sql: MAX(${updated_raw}) ;;
  convert_tz: no
}

在此示例中,我们没有使用 type: max 指标来创建 last_updated_date 指标,而是在 sql 参数中应用了 MAX() 函数。此外,last_updated_date 指标的 convert_tz 参数设置为 no,以防止在指标中进行双重时区转换,因为时区转换已在维度组 updated 的定义中进行。如需了解详情,请参阅有关 convert_tz 参数的文档。

last_updated_date 度量的 LookML 示例中,可以省略 type: date,该值将被视为字符串,因为 stringtype 的默认值。不过,如果您使用 type: date,则可以为用户提供更出色的过滤功能。

您可能还会注意到,last_updated_date 指标定义引用的是 ${updated_raw} 时间范围,而不是 ${updated_date} 时间范围。由于 ${updated_date} 返回的值是字符串,因此必须使用 ${updated_raw} 来引用实际的日期值。

您还可以将 datatype 参数与 type: date 搭配使用,通过指定数据库表使用的日期数据类型来提升查询性能。

为日期时间列创建最大值或最小值度量

计算 type: datetime 列的最大值略有不同。在这种情况下,您需要创建一个不声明类型的指标,如下所示:

measure: last_updated_datetime {
  sql: MAX(${TABLE}.datetime_string_field) ;;
}

list

type: list 可创建给定字段中不同值的列表。它类似于 MySQL 的 GROUP_CONCAT 函数。

对于 type: list 指标,您无需添加 sql 参数。不过,您可以使用 list_field 参数指定要从中创建名单的维度。

用法如下:

view: view_name {
  measure: field_name {
    type: list
    list_field: my_field_name
  }
}

例如,以下 LookML 会基于 name 维度创建衡量指标 name_list

measure: name_list {
  type: list
  list_field: name
}

请注意以下有关 list 的事项:

  • list 指标类型不支持过滤。您无法对 type: list 度量使用 filters 参数。
  • 无法使用替换运算符 ($) 引用 list 度量类型。您无法使用 ${} 语法来引用 type: list 度量。

list 支持的数据库方言

为了让 Looker 在您的 Looker 项目中支持 type: list,您的数据库方言也必须支持它。下表显示了 Looker 最新版本中哪些方言支持 type: list

方言 是否支持?
Actian Avalanche
Amazon Athena
Amazon Aurora MySQL
Amazon Redshift
Amazon Redshift 2.1+
Amazon Redshift Serverless 2.1+
Apache Druid
Apache Druid 0.13+
Apache Druid 0.18+
Apache Hive 2.3+
Apache Hive 3.1.2+
Apache Spark 3+
ClickHouse
Cloudera Impala 3.1+
Cloudera Impala 3.1+ with Native Driver
Cloudera Impala with Native Driver
DataVirtuality
Databricks
Denodo 7
Denodo 8 & 9
Dremio
Dremio 11+
Exasol
Google BigQuery Legacy SQL
Google BigQuery Standard SQL
Google Cloud PostgreSQL
Google Cloud SQL
Google Spanner
Greenplum
HyperSQL
IBM Netezza
MariaDB
Microsoft Azure PostgreSQL
Microsoft Azure SQL Database
Microsoft Azure Synapse Analytics
Microsoft SQL Server 2008+
Microsoft SQL Server 2012+
Microsoft SQL Server 2016
Microsoft SQL Server 2017+
MongoBI
MySQL
MySQL 8.0.12+
Oracle
Oracle ADWC
PostgreSQL 9.5+
PostgreSQL pre-9.5
PrestoDB
PrestoSQL
SAP HANA
SAP HANA 2+
SingleStore
SingleStore 7+
Snowflake
Teradata
Trino
Vector
Vertica

max

type: max 用于查找指定字段中的最大值。它使用 SQL 的 MAX 函数。

对于 type: max 的度量,sql 参数可以采用任何有效的 SQL 表达式,该表达式会生成数字表格列、LookML 维度或 LookML 维度的组合。

由于 type: max 的衡量指标仅与数值字段兼容,因此您无法使用 type: max 的衡量指标来查找最晚日期。不过,您可以在 type: date 度量的 sql 参数中使用 MAX() 函数来捕获最晚日期,如前面 date 部分的示例所示。

可以使用 value_formatvalue_format_name 参数设置 type: max 字段的格式。

例如,以下 LookML 通过查看 sales_price 维度创建了一个名为 largest_order 的字段,然后以货币格式($1,234.56)显示该字段:

measure: largest_order {
  type: max
  sql: ${sales_price} ;;
  value_format_name: usd
}

您无法将 type: max 指标用于字符串或日期,但可以手动添加 MAX 函数来创建此类字段,如下所示:

measure: latest_name_in_alphabet {
  type: string
  sql: MAX(${name}) ;;
}

median

type: median 返回指定字段中各值的中间值。当数据中存在一些非常大或非常小的离群值,这些值会使数据的基本平均值(平均数)出现偏差时,此方法尤其有用。

假设有一个如下所示的表:

订单项 ID 费用 中点?
2 10.00
4 10.00
3 20.00 中间点值
1 80.00
5 90.00

该表按费用排序,但这不会影响结果。虽然 average 类型会返回 42(将所有值相加并除以 5),但 median 类型会返回中点值:20.00。

如果值的数量为偶数,则中位数值的计算方法是取最接近中点的两个值的平均值。假设有一个包含偶数行的表格,如下所示:

订单项 ID 费用 中点?
2 10
3 20 中点前最接近的时间点
1 80 中点后最近的
4 90

中位数(中间值)为 (20 + 80)/2 = 50

中位数也等于第 50 百分位的值。

type: median 衡量指标的 sql 参数可以采用任何有效的 SQL 表达式,该表达式会生成数值表列、LookML 维度或 LookML 维度的组合。

可以使用 value_formatvalue_format_name 参数设置 type: median 字段的格式。

示例

例如,以下 LookML 通过对 sales_price 维度求平均值来创建名为 median_order 的字段,然后以货币格式(1,234.56 美元)显示该字段:

measure: median_order {
  type: median
  sql: ${sales_price} ;;
  value_format_name: usd
}

median 的注意事项

如果您将 median 用于涉及 扇出的字段,Looker 会尝试改用 median_distinct。不过,medium_distinct 仅支持某些方言。如果您的方言不支持 median_distinct,Looker 会返回错误。由于 median 可以视为第 50 百分位,因此该错误表明相应方言不支持不同的百分位。

median 支持的数据库方言

为了让 Looker 项目支持 median 类型,您的数据库方言也必须支持该类型。下表显示了 Looker 最新版本中哪些方言支持 median 类型:

方言 是否支持?
Actian Avalanche
Amazon Athena
Amazon Aurora MySQL
Amazon Redshift
Amazon Redshift 2.1+
Amazon Redshift Serverless 2.1+
Apache Druid
Apache Druid 0.13+
Apache Druid 0.18+
Apache Hive 2.3+
Apache Hive 3.1.2+
Apache Spark 3+
ClickHouse
Cloudera Impala 3.1+
Cloudera Impala 3.1+ with Native Driver
Cloudera Impala with Native Driver
DataVirtuality
Databricks
Denodo 7
Denodo 8 & 9
Dremio
Dremio 11+
Exasol
Google BigQuery Legacy SQL
Google BigQuery Standard SQL
Google Cloud PostgreSQL
Google Cloud SQL
Google Spanner
Greenplum
HyperSQL
IBM Netezza
MariaDB
Microsoft Azure PostgreSQL
Microsoft Azure SQL Database
Microsoft Azure Synapse Analytics
Microsoft SQL Server 2008+
Microsoft SQL Server 2012+
Microsoft SQL Server 2016
Microsoft SQL Server 2017+
MongoBI
MySQL
MySQL 8.0.12+
Oracle
Oracle ADWC
PostgreSQL 9.5+
PostgreSQL pre-9.5
PrestoDB
PrestoSQL
SAP HANA
SAP HANA 2+
SingleStore
SingleStore 7+
Snowflake
Teradata
Trino
Vector
Vertica

如果查询中涉及扇出,Looker 会尝试将 median 转换为 median_distinct。仅在支持 median_distinct方言中成功。

median_distinct

当您的联接涉及扇出时,请使用 type: median_distinct。它会根据 sql_distinct_key 参数定义的唯一值,计算指定字段中非重复值的平均值。如果度量没有 sql_distinct_key 参数,Looker 会尝试使用 primary_key 字段。

假设某个查询联接了“订单项”表和“订单”表,结果如下:

订单项 ID 订单 ID 订单配送
1 1 10
2 1 10
3 2 20
4 3 50
5 3 50
6 3 50

在这种情况下,您可以看到每个订单都有多行。此查询涉及扇出,因为每个订单都映射到多个订单项。median_distinct 会将此情况纳入考虑范围,并找到不同值 10、20 和 50 之间的中位数,因此您会得到值 20。

为了获得准确的结果,您可以使用 sql_distinct_key 参数为 Looker 定义应如何识别每个唯一实体(在本例中为每个唯一订单)。这样就能计算出正确的金额:

measure: median_shipping {
  type: median_distinct
  sql_distinct_key: ${order_id} ;;
  sql: ${order_shipping} ;;
}

sql_distinct_key 的每个唯一值都必须在指标的 sql 参数中有一个对应的值。换句话说,上述示例之所以有效,是因为 order_id 为 1 的行的 order_shipping 都是 10,而 order_id 为 2 的行的 order_shipping 都是 20。

可以使用 value_formatvalue_format_name 参数设置 type: median_distinct 字段的格式。

median_distinct 的注意事项

medium_distinct 衡量类型仅支持某些方言。如果方言不支持 median_distinct,Looker 会返回错误。由于 median 可以视为第 50 百分位,因此该错误表明相应方言不支持不同的百分位。

median_distinct 支持的数据库方言

为了让 Looker 项目支持 median_distinct 类型,您的数据库方言也必须支持该类型。下表显示了 Looker 最新版本中哪些方言支持 median_distinct 类型:

方言 是否支持?
Actian Avalanche
Amazon Athena
Amazon Aurora MySQL
Amazon Redshift
Amazon Redshift 2.1+
Amazon Redshift Serverless 2.1+
Apache Druid
Apache Druid 0.13+
Apache Druid 0.18+
Apache Hive 2.3+
Apache Hive 3.1.2+
Apache Spark 3+
ClickHouse
Cloudera Impala 3.1+
Cloudera Impala 3.1+ with Native Driver
Cloudera Impala with Native Driver
DataVirtuality
Databricks
Denodo 7
Denodo 8 & 9
Dremio
Dremio 11+
Exasol
Google BigQuery Legacy SQL
Google BigQuery Standard SQL
Google Cloud PostgreSQL
Google Cloud SQL
Google Spanner
Greenplum
HyperSQL
IBM Netezza
MariaDB
Microsoft Azure PostgreSQL
Microsoft Azure SQL Database
Microsoft Azure Synapse Analytics
Microsoft SQL Server 2008+
Microsoft SQL Server 2012+
Microsoft SQL Server 2016
Microsoft SQL Server 2017+
MongoBI
MySQL
MySQL 8.0.12+
Oracle
Oracle ADWC
PostgreSQL 9.5+
PostgreSQL pre-9.5
PrestoDB
PrestoSQL
SAP HANA
SAP HANA 2+
SingleStore
SingleStore 7+
Snowflake
Teradata
Trino
Vector
Vertica

min

type: min 用于查找指定字段中的最小值。它使用 SQL 的 MIN 函数。

对于 type: min 的度量,sql 参数可以采用任何有效的 SQL 表达式,该表达式会生成数字表格列、LookML 维度或 LookML 维度的组合。

由于 type: min 的衡量指标仅与数字字段兼容,因此您无法使用 type: min 的衡量指标来查找最早日期。不过,您可以在 type: date 指标的 sql 参数中使用 MIN() 函数来捕获最小值,就像您可以使用 MAX() 函数来捕获 type: date 指标的最大日期一样。如本页面的date部分所示,该部分包含在 sql 参数中使用 MAX() 函数查找最晚日期的示例。

可以使用 value_formatvalue_format_name 参数设置 type: min 字段的格式。

例如,以下 LookML 通过查看 sales_price 维度创建了一个名为 smallest_order 的字段,然后以货币格式($1,234.56)显示该字段:

measure: smallest_order {
  type: min
  sql: ${sales_price} ;;
  value_format_name: usd
}

您无法将 type: min 指标用于字符串或日期,但可以手动添加 MIN 函数来创建此类字段,如下所示:

measure: earliest_name_in_alphabet {
  type: string
  sql: MIN(${name}) ;;
}

number

type: number 可与数字或整数搭配使用。值为 type: number 的指标不执行任何汇总,旨在对其他指标执行基本转换。如果您要定义的指标基于另一个指标,则新指标必须为 type: number,以避免出现嵌套的聚合错误。

type: number 指标的 sql 参数可以采用任何有效的 SQL 表达式,只要该表达式的结果为数字或整数即可。

可以使用 value_formatvalue_format_name 参数设置 type: number 字段的格式。

例如,以下 LookML 会基于 total_sale_pricetotal_gross_margin 汇总度量创建一个名为 total_gross_margin_percentage 的度量,然后以百分比格式显示该度量,并保留两位小数 (12.34%):

measure: total_sale_price {
  type: sum
  value_format_name: usd
  sql: ${sale_price} ;;
}

measure: total_gross_margin {
  type: sum
  value_format_name: usd
  sql: ${gross_margin} ;;
}

measure: total_gross_margin_percentage {
  type: number
  value_format_name: percent_2
  sql: ${total_gross_margin}/ NULLIF(${total_sale_price},0) ;;
}

此示例还使用 NULLIF() SQL 函数来消除除以零错误的发生。

type: number 的注意事项

使用 type: number 指标时,请注意以下几点重要事项:

  • type: number 的度量只能对其他度量执行算术运算,而不能对其他维度执行算术运算。
  • 当跨联接计算时,Looker 的对称聚合不会保护度量 type: number 的 SQL 中的聚合函数。
  • filters 参数不能与 type: number 度量一起使用,但 filters 文档中介绍了解决方法。
  • type: number 指标不会向用户提供建议。

percent_of_previous

type: percent_of_previous 用于计算某个单元格与其所在列中前一个单元格之间的百分比差值。

type: percent_of_previous 指标的 sql 参数必须引用另一个数值指标。

可以使用 value_formatvalue_format_name 参数设置 type: percent_of_previous 字段的格式。不过,value_format_name 参数的百分比格式不适用于 type: percent_of_previous 指标。这些百分比格式会将值乘以 100,从而使“占上期百分比”计算的结果出现偏差。

此 LookML 示例创建了一个基于 count 指标的 count_growth 指标:

measure: count_growth {
  type: percent_of_previous
  sql: ${count} ;;
}

请注意,percent_of_previous 值取决于排序顺序。如果您更改了排序,则必须重新运行查询以重新计算 percent_of_previous 值。如果查询经过透视,percent_of_previous 会在行中运行,而不是在列中运行。您无法更改此行为。

此外,percent_of_previous 指标是在从数据库返回数据计算的。这意味着您不应在一个指标内引用另一个 percent_of_previous 指标;由于它们可能在不同时间计算,因此您可能无法获得准确的结果。这也意味着,无法根据 percent_of_previous 指标进行过滤。

此类指标的一个应用是同比 (PoP) 分析,这是一种分析模式,用于衡量当前的情况,并将其与过去类似时间段的相同衡量结果进行比较。如需详细了解 PoP,请参阅 Looker 社区文章如何进行同比分析Looker 中的同比 (PoP) 分析方法

percent_of_total

type: percent_of_total 用于计算单元格在列总计中所占的比例。该百分比是根据查询返回的行总数计算的,而非所有可能的行总数。不过,如果查询返回的数据超出行数限制,该字段的值将显示为 null,因为系统需要完整的结果才能计算出占总数的百分比。

type: percent_of_total 指标的 sql 参数必须引用另一个数值指标。

可以使用 value_formatvalue_format_name 参数设置 type: percent_of_total 字段的格式。不过,value_format_name 参数的百分比格式不适用于 type: percent_of_total 指标。这些百分比格式会将值乘以 100,从而导致 percent_of_total 计算结果出现偏差。

此 LookML 示例创建了一个基于 total_gross_margin 指标的 percent_of_total_gross_margin 指标:

measure: percent_of_total_gross_margin {
  type: percent_of_total
  sql: ${total_gross_margin} ;;
}

如果查询经过透视,percent_of_total 会在行中运行,而不是在列中运行。如果这不是您想要的结果,请向指标定义添加 direction: "column"

此外,percent_of_total 指标是在从数据库返回数据计算的。这意味着您不应在一个指标内引用另一个 percent_of_total 指标;由于它们可能在不同时间计算,因此您可能无法获得准确的结果。这也意味着,无法根据 percent_of_total 指标进行过滤。

percentile

type: percentile 返回指定字段中指定百分位的值。例如,指定第 75 百分位将返回大于数据集中 75% 其他值的值。

为了确定要返回的值,Looker 会计算数据值的总数,然后将指定的百分位数乘以数据值的总数。无论数据的实际排序方式如何,Looker 都会按升序识别数据值的相对顺序。Looker 返回的数据值取决于计算结果是否为整数,如以下两个部分中所述。

如果计算出的值不是整数

Looker 会将计算出的值向上舍入,并使用该值来确定要返回的数据值。在此示例中,有一组包含 19 个考试分数的数据,第 75 百分位数可通过以下计算得出:19 * 0.75 = 14.25。这意味着,75% 的值位于前 14 个数据值中,即低于第 15 个位置。因此,Looker 会返回第 15 个数据值 (87),因为该值大于 75% 的数据值。

如果计算出的值为整数

在这种稍复杂的情况下,Looker 会返回该位置的数据值和后续数据值的平均值。为了理解这一点,我们以一组包含 20 个测试分数的数据为例:第 75 百分位数为 20 * 0.75 = 15,这意味着第 15 个位置的数据值属于第 75 百分位数,我们需要返回一个高于 75% 数据值的值。通过返回第 15 位 (82) 和第 16 位 (87) 值的平均值,Looker 可确保 75%。该平均值 (84.5) 不存在于数据值集中,但会大于 75% 的数据值。

必需参数和可选参数

使用 percentile: 关键字指定分数值,即应低于返回值的百分比数据。例如,使用 percentile: 75 可指定按数据顺序排列的第 75 百分位值,使用 percentile: 10 可返回第 10 百分位值。如果您想查找第 50 百分位的值,可以指定 percentile: 50,也可以直接使用中位数类型。

type: percentile 衡量指标的 sql 参数可以采用任何有效的 SQL 表达式,该表达式会生成数值表列、LookML 维度或 LookML 维度的组合。

可以使用 value_formatvalue_format_name 参数设置 type: percentile 字段的格式。

示例

例如,以下 LookML 会创建一个名为 test_scores_75th_percentile 的字段,该字段会返回 test_scores 维度中第 75 百分位的值:

measure: test_scores_75th_percentile {
  type: percentile
  percentile: 75
  sql: ${TABLE}.test_scores ;;
}

percentile 的注意事项

如果您将 percentile 用于涉及扇出的字段,Looker 会尝试改用 percentile_distinct。如果方言不支持 percentile_distinct,Looker 会返回错误。如需了解详情,请参阅percentile_distinct 支持的方言

percentile 支持的数据库方言

为了让 Looker 项目支持 percentile 类型,您的数据库方言也必须支持该类型。下表显示了 Looker 最新版本中哪些方言支持 percentile 类型:

方言 是否支持?
Actian Avalanche
Amazon Athena
Amazon Aurora MySQL
Amazon Redshift
Amazon Redshift 2.1+
Amazon Redshift Serverless 2.1+
Apache Druid
Apache Druid 0.13+
Apache Druid 0.18+
Apache Hive 2.3+
Apache Hive 3.1.2+
Apache Spark 3+
ClickHouse
Cloudera Impala 3.1+
Cloudera Impala 3.1+ with Native Driver
Cloudera Impala with Native Driver
DataVirtuality
Databricks
Denodo 7
Denodo 8 & 9
Dremio
Dremio 11+
Exasol
Google BigQuery Legacy SQL
Google BigQuery Standard SQL
Google Cloud PostgreSQL
Google Cloud SQL
Google Spanner
Greenplum
HyperSQL
IBM Netezza
MariaDB
Microsoft Azure PostgreSQL
Microsoft Azure SQL Database
Microsoft Azure Synapse Analytics
Microsoft SQL Server 2008+
Microsoft SQL Server 2012+
Microsoft SQL Server 2016
Microsoft SQL Server 2017+
MongoBI
MySQL
MySQL 8.0.12+
Oracle
Oracle ADWC
PostgreSQL 9.5+
PostgreSQL pre-9.5
PrestoDB
PrestoSQL
SAP HANA
SAP HANA 2+
SingleStore
SingleStore 7+
Snowflake
Teradata
Trino
Vector
Vertica

percentile_distinct

type: percentile_distinct百分位数的一种特殊形式,应在联接涉及扇出时使用。它会根据 sql_distinct_key 参数定义的唯一值,使用指定字段中的非重复值。如果度量没有 sql_distinct_key 参数,Looker 会尝试使用 primary_key 字段。

假设某个查询联接了“订单项”表和“订单”表,结果如下:

订单项 ID 订单 ID 订单配送
1 1 10
2 1 10
3 2 20
4 3 50
5 3 50
6 3 50
7 4 70
8 4 70
9 5 110
10 5 110

在这种情况下,您可以看到每个订单都有多行。此查询涉及扇出,因为每个订单都映射到多个订单项。percentile_distinct 会考虑到这一点,并使用不同的值 10、20、50、70 和 110 来查找百分位数值。第 25 百分位将返回第二个不同的值(即 20),而第 80 百分位将返回第四个和第五个不同的值的平均值(即 90)。

必需参数和可选参数

使用 percentile: 关键字指定小数值。例如,使用 percentile: 75 可指定按数据顺序排列的第 75 百分位值,使用 percentile: 10 可返回第 10 百分位值。如果您想查找第 50 百分位的值,可以改用 median_distinct 类型。

为了获得准确的结果,请使用 sql_distinct_key 参数指定 Looker 应如何识别每个唯一实体(在本例中为每个唯一订单)。

以下示例展示了如何使用 percentile_distinct 返回第 90 百分位的值:

measure: order_shipping_90th_percentile {
  type: percentile_distinct
  percentile: 90
  sql_distinct_key: ${order_id} ;;
  sql: ${order_shipping} ;;
}

sql_distinct_key 的每个唯一值都必须在指标的 sql 参数中有一个对应的值。换句话说,上述示例之所以有效,是因为 order_id 为 1 的行的 order_shipping 均为 10,而 order_id 为 2 的每行的 order_shipping 均为 20。

可以使用 value_formatvalue_format_name 参数设置 type: percentile_distinct 字段的格式。

percentile_distinct 的注意事项

如果方言不支持 percentile_distinct,Looker 会返回错误。如需了解详情,请参阅percentile_distinct 支持的方言

percentile_distinct 支持的数据库方言

为了让 Looker 项目支持 percentile_distinct 类型,您的数据库方言也必须支持该类型。下表显示了 Looker 最新版本中哪些方言支持 percentile_distinct 类型:

方言 是否支持?
Actian Avalanche
Amazon Athena
Amazon Aurora MySQL
Amazon Redshift
Amazon Redshift 2.1+
Amazon Redshift Serverless 2.1+
Apache Druid
Apache Druid 0.13+
Apache Druid 0.18+
Apache Hive 2.3+
Apache Hive 3.1.2+
Apache Spark 3+
ClickHouse
Cloudera Impala 3.1+
Cloudera Impala 3.1+ with Native Driver
Cloudera Impala with Native Driver
DataVirtuality
Databricks
Denodo 7
Denodo 8 & 9
Dremio
Dremio 11+
Exasol
Google BigQuery Legacy SQL
Google BigQuery Standard SQL
Google Cloud PostgreSQL
Google Cloud SQL
Google Spanner
Greenplum
HyperSQL
IBM Netezza
MariaDB
Microsoft Azure PostgreSQL
Microsoft Azure SQL Database
Microsoft Azure Synapse Analytics
Microsoft SQL Server 2008+
Microsoft SQL Server 2012+
Microsoft SQL Server 2016
Microsoft SQL Server 2017+
MongoBI
MySQL
MySQL 8.0.12+
Oracle
Oracle ADWC
PostgreSQL 9.5+
PostgreSQL pre-9.5
PrestoDB
PrestoSQL
SAP HANA
SAP HANA 2+
SingleStore
SingleStore 7+
Snowflake
Teradata
Trino
Vector
Vertica

period_over_period

对于支持不同时间段对比度量的方言,您可以创建 LookML 度量 type: period_over_period 来创建不同时间段对比 (PoP) 度量。PoP 指标是指对较早时间段的汇总。

以下是一个提供上个月订单数量的 PoP 指标示例:

  measure: orders_last_month {
    type: period_over_period
    based_on: orders.count
    based_on_time: orders.created_month
    period: month
    kind: previous
  }

具有 type: period_over_period 的衡量指标还必须具有以下子参数:

如需了解详情和示例,请参阅 Looker 中的同比指标

running_total

type: running_total 计算列中单元格的累计总和。它不能用于计算行中的总和,除非该行是透视的结果。

type: running_total 指标的 sql 参数必须引用另一个数值指标。

可以使用 value_formatvalue_format_name 参数设置 type: running_total 字段的格式。

以下 LookML 示例创建了一个基于 total_sale_price 指标的 cumulative_total_revenue 指标:

measure: cumulative_total_revenue {
  type: running_total
  sql: ${total_sale_price} ;;
  value_format_name: usd
}

请注意,running_total 值取决于排序顺序。如果您更改了排序,则必须重新运行查询以重新计算 running_total 值。如果查询经过透视,running_total 会在行中运行,而不是在列中运行。如果这不是您想要的结果,请向指标定义添加 direction: "column"

此外,running_total 指标是在从数据库返回数据计算的。这意味着您不应在一个指标内引用另一个 running_total 指标;由于它们可能在不同时间计算,因此您可能无法获得准确的结果。这也意味着,无法根据 running_total 指标进行过滤。

string

type: string 用于包含字母或特殊字符的字段。

type: string 指标的 sql 参数可以采用任何有效的 SQL 表达式,只要该表达式的结果为字符串即可。实际上,这种类型很少使用,因为大多数 SQL 聚合函数不会返回字符串。一个常见的例外情况是 MySQL 的 GROUP_CONCAT 函数,不过 Looker 针对该用例提供了 type: list

例如,以下 LookML 通过合并名为 category 的字段的唯一值来创建字段 category_list

measure: category_list {
  type: string
  sql: GROUP_CONCAT(${category}) ;;
}

在此示例中,type: string 可以省略,因为 stringtype 的默认值。

sum

type: sum 会将指定字段中的值相加。它类似于 SQL 的 SUM 函数。不过,与原始 SQL 不同的是,即使查询的联接包含扇出,Looker 也会正确计算总和。

type: sum 衡量指标的 sql 参数可以采用任何有效的 SQL 表达式,该表达式会生成数值表列、LookML 维度或 LookML 维度的组合。

可以使用 value_formatvalue_format_name 参数设置 type: sum 字段的格式。

例如,以下 LookML 通过将 sales_price 维度相加来创建名为 total_revenue 的字段,然后以货币格式($1,234.56)显示该字段:

measure: total_revenue {
  type: sum
  sql: ${sales_price} ;;
  value_format_name: usd
}

sum_distinct

type: sum_distinct 适用于非规范化数据集。它会根据 sql_distinct_key 参数定义的唯一值,将指定字段中的非重复值相加。

这是一个高级概念,通过示例可以更清楚地说明。假设有一个如下所示的非规范化表:

订单项 ID 订单 ID 订单配送
1 1 10.00
2 1 10.00
3 2 20.00
4 2 20.00
5 2 20.00

在这种情况下,您可以看到每个订单都有多行。因此,如果您为 order_shipping 列添加了 type: sum 指标,您会得到 80.00 的总和,即使实际收取的运费总额为 30.00。

 # Will NOT calculate the correct shipping amount
measure: total_shipping {
  type: sum
  sql: ${order_shipping} ;;
}

为了获得准确的结果,您可以使用 sql_distinct_key 参数为 Looker 定义应如何识别每个唯一实体(在本例中为每个唯一订单)。此公式计算出正确的 30.00 金额:

 # Will calculate the correct shipping amount
measure: total_shipping {
  type: sum_distinct
  sql_distinct_key: ${order_id} ;;
  sql: ${order_shipping} ;;
}

sql_distinct_key 的每个唯一值在 sql 中都必须只有一个对应的值。换句话说,上述示例之所以有效,是因为 每个 order_id 为 1 的行都具有相同的 order_shipping 值 10.00,并且每个 order_id 为 2 的行都具有相同的 order_shipping 值 20.00。

可以使用 value_formatvalue_format_name 参数设置 type: sum_distinct 字段的格式。

yesno

type: yesno 会创建一个字段来指明某个内容是 true 还是 false。这些值在探索界面中显示为 YesNo

type: yesno 指标的 sql 参数接受计算结果为 TRUEFALSE 的有效 SQL 表达式。如果条件计算结果为 TRUE,则向用户显示;否则,显示

type: yesno 度量的 SQL 表达式必须仅包含聚合,这意味着 SQL 聚合或对 LookML 度量的引用。如果您想创建一个包含对 LookML 维度或非聚合 SQL 表达式的引用的 yesno 字段,请使用带有 type: yesno维度,而不是度量。

与具有 type: number 的度量类似,具有 type: yesno 的度量不会进行任何汇总,只会引用其他汇总。

例如,以下 total_sale_price 指标示例是订单中订单商品的总销售价格之和。第二种衡量指标(称为 is_large_total)为 type: yesnois_large_total 指标具有 sql 参数,用于评估 total_sale_price 值是否大于 1,000 美元。

measure: total_sale_price {
  type: sum
  value_format_name: usd
  sql: ${sale_price} ;;
  drill_fields: [detail*]
}
measure: is_large_total {
  description: "Is order total over $1000?"
  type: yesno
  sql: ${total_sale_price} > 1000 ;;
}

如果您想在另一个字段中引用 type: yesno 字段,则应将 type: yesno 字段视为布尔值(换句话说,就好像它已包含 true 或 false 值)。例如:

measure: is_large_total {
  description: "Is order total over $1000?"
  type: yesno
  sql: ${total_sale_price} > 1000 ;;
}
# This is correct:
measure: reward_points {
  type: number
  sql: CASE WHEN ${is_large_total} THEN 200 ELSE 100 END ;;
}
# This is NOT correct:
measure: reward_points {
  type: number
  sql: CASE WHEN ${is_large_total} = 'Yes' THEN 200 ELSE 100 END ;;
}