衡量类型

本页引用了衡量中的 type 参数。

type 也可以用作维度过滤条件(如维度、过滤条件和参数类型文档页面中所述)。

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

用量

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

接受
衡量类型

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

有些测量类型具有相应的支持参数,相应部分对此进行了说明。

衡量类型类别

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

  • 汇总衡量:汇总衡量类型可执行汇总,例如 sumaverage。汇总的衡量指标只能引用维度,而不能引用其他衡量指标。这是唯一可与 filters 参数搭配使用的衡量类型。
  • 非汇总措施:顾名思义,非汇总措施是指不会执行汇总的操作类型,例如 numberyesno。这些衡量类型会执行简单的转换,而且它们不执行汇总,因此只能引用汇总的衡量指标或之前汇总的维度。您不能将 filters 参数用于这些测量类型。
  • SQL 后衡量:SQL 后衡量是一种特殊衡量类型,会在 Looker 生成查询 SQL 后执行特定计算。它们只能引用数字计量单位或数字维度。您不能将 filters 参数用于这些测量类型。

类型定义列表

类型 类别 说明
average 汇总 在列中生成值的平均值
average_distinct 汇总 使用反规范化数据时正确生成值(平均值)。如需查看完整说明,请参阅下文。
count 汇总 生成行数
count_distinct 汇总 生成列中的唯一值的计数
date 非汇总 针对包含日期的措施
list 汇总 生成某一列中唯一值的列表
max 汇总 在列中生成最大值
median 汇总 生成列中值的中位数(中点值)
median_distinct 汇总 当联接导致扇出时,正确生成值的中位数(中点值)。如需查看完整说明,请参阅下文。
min 汇总 在列中生成最小值
number 非汇总 针对包含数字的措施
percent_of_previous SQL 之后 生成显示行数之间的百分比差异
percent_of_total SQL 之后 生成每个显示行的总百分比
percentile 汇总 根据列中的指定百分位生成值
percentile_distinct 汇总 当联接导致扇出时,以指定的百分位正确生成值。如需查看完整说明,请参阅下文。
running_total SQL 之后 为显示的每个行生成运行总计
string 非汇总 适用于包含字母或特殊字符的计量单位(例如 MySQL 的 GROUP_CONCAT 函数)
sum 汇总 在列中生成值的总和
sum_distinct 汇总 在使用反规范化数据时正确生成值总和。
请参阅下文的定义,获取完整说明。
yesno 非汇总 对于将在某些情况下为 true 或 false 显示的字段
int 非汇总 已移除 5.4 已替换为 type: number

average

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

type: average 衡量的 sql 参数可以采用产生数字表列、LookML 维度或 LookML 维度组合的任何有效 SQL 表达式。

您可以使用 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 测量值,那么即使实际的平均值为 15.00,您也会获得 16.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 测量不支持 sql 参数,因为 type: count 测量会根据表的主键执行表计数。如果您要对表的主键以外的某个字段执行表计数,请使用 type: count_distinct 衡量。

例如,以下 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

如果您想对非主键字段执行 COUNT(而不是 COUNT_DISTINCT),可以使用 type: number 进行衡量。如需了解详情,请参阅这篇帮助中心文章:countcount_distinct 衡量类型之间的区别

您可以使用 filters 参数向 type: count 的测量值添加过滤条件。

count_distinct

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

type: count_distinct 衡量的 sql 参数可以采用任何产生表列、LookML 维度或 LookML 维度组合的有效 SQL 表达式。

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

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 并将最大日期或最小日期封装在 MIN()MAX() 函数的 sql 参数中引用的日期字段,来捕获日期的最大值或最小值。

假设您有一个名为 updatedtype: time维度组

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
}

在此示例中,我们使用 sql 参数来应用 MAX() 函数,而不是使用 type: max 的测量值来创建 last_updated_date 测量值。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_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 的方言:

max

type: max 会查找给定字段中的最大值。它利用 SQL 的 MAX 函数。

用于 type: max 衡量的 sql 参数可接受任何产生数字表列、LookML 维度或 LookML 维度组合的任何有效 SQL 表达式。

由于 type: max 的测量值仅与数值字段兼容,因此您不能使用 type: max 的测量值来查找最大日期。您可以改为使用 type: datesql 参数中的 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 参数可以采用产生数字表列、LookML 维度或 LookML 维度组合的任何有效 SQL 表达式。

您可以使用 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 支持 Looker 项目中的 median 类型,您的数据库方言也必须支持它。下表显示了最新版 Looker 中支持 median 类型的方言:

当查询涉及扇出时,Looker 会尝试将 median 转换为 median_distinct。只有支持 median_distinct 的方言才能成功。

median_distinct

如果连接涉及扇出,请使用 type: median_distinct。它根据 sql_distinct_key 参数定义的唯一值对给定字段中的非重复值求平均值。如果测量结果中没有 sql_distinct_key 参数,Looker 就会尝试使用 primary_key 字段。

请思考联接了 Order Item 和 Order 表的查询结果:

订单商品 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 支持 Looker 项目中的 median_distinct 类型,您的数据库方言也必须支持它。下表显示了最新版 Looker 中支持 median_distinct 类型的方言:

min

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

用于 type: min 衡量的 sql 参数可接受任何产生数字表列、LookML 维度或 LookML 维度组合的任何有效 SQL 表达式。

由于 type: min 的测量值仅与数值字段兼容,因此您不能使用 type: min 的测量值找出最小日期。相反,您可以在 type: datesql 参数中使用 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 测量值中的聚合函数。
  • 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} ;;
}

在 Looker 界面中,如下所示:

请注意,percent_of_previous 值取决于排序顺序。如果您更改排序,则必须重新运行查询以重新计算 percent_of_previous 值。对于查询进行数据透视,percent_of_previous 会跨行运行,而不是沿着列运行。您目前无法更改此行为。

此外,percent_of_previous 是在数据库返回数据后计算的。这意味着,您不能将 percent_of_previous 测量值与其他测量值搭配使用;因为它们在不同的时间计算,所以可能无法获得准确的结果。这也意味着无法对 percent_of_previous 措施进行过滤。

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} ;;
}

在 Looker 界面中,如下所示:

对于查询进行数据透视,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 * .75 = 14.25 表示,这意味着 75% 的值位于前 14 个数据值中,低于第 15 位。因此,Looker 会返回第 15 个数据值 (87),因为它大于数据值的 75%。

如果计算值是整数

在这种稍微复杂的情况下,Looker 会返回该位置的数据值的平均值和以下数据值。为了理解这一点,我们假设一组 20 个测试分数,第 75 个百分位数将通过 20 * .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 参数可以采用产生数字表列、LookML 维度或 LookML 维度组合的任何有效 SQL 表达式。

您可以使用 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 支持 Looker 项目中的 percentile 类型,您的数据库方言也必须支持它。下表显示了最新版 Looker 中支持 percentile 类型的方言:

percentile_distinct

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

请思考联接了 Order Item 和 Order 表的查询结果:

订单商品 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 支持 Looker 项目中的 percentile_distinct 类型,您的数据库方言也必须支持它。下表显示了最新版 Looker 中支持 percentile_distinct 类型的方言:

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
}

在 Looker 界面中,如下所示:

请注意,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 参数可以采用产生数字表列、LookML 维度或 LookML 维度组合的任何有效 SQL 表达式。

您可以使用 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。这些值在探索界面中显示为

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

type: yesno 测量的 SQL 表达式必须仅包含聚合,即 SQL 聚合或对 LookML 测量的引用。如果您要创建 yesno 字段,使其包含对 LookML 维度或非聚合的 SQL 表达式的引用,请使用带有 type: yesno维度,而不是测量值。

与使用 type: number 的测量类似,使用 type: yesno 的测量不会进行任何汇总;它只引用其他汇总。

例如,以下 total_sale_price 衡量指标是订单中商品的总售价的总和。第二个名为 is_large_total 的衡量指标为 type: yesnois_large_total 衡量指标有一个 sql 参数,用于评估 total_sale_price 值是否大于 1000 美元。

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 ;;
}