本页引用了衡量中的
type
参数。
type
也可以用作维度或过滤条件(如维度、过滤条件和参数类型文档页面中所述)。
type
还可用作维度组的一部分(如dimension_group
参数文档页面中所述)。
用量
measure: field_name {
type: measure_field_type
}
}
层次结构
type |
可能的字段类型
衡量接受
衡量类型 |
本页面详细介绍了可分配给衡量活动的各种类型。每个衡量只能有一个类型,如果未指定类型,则默认为 string
。
有些测量类型具有相应的支持参数,相应部分对此进行了说明。
衡量类型类别
每种衡量类型都属于以下某个类别。这些类别决定了测量类型是否执行聚合、测量类型可以引用的字段类型,以及您是否可以使用 filters
参数过滤测量类型:
- 汇总衡量:汇总衡量类型可执行汇总,例如
sum
和average
。汇总的衡量指标只能引用维度,而不能引用其他衡量指标。这是唯一可与filters
参数搭配使用的衡量类型。 - 非汇总措施:顾名思义,非汇总措施是指不会执行汇总的操作类型,例如
number
和yesno
。这些衡量类型会执行简单的转换,而且它们不执行汇总,因此只能引用汇总的衡量指标或之前汇总的维度。您不能将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_format
或 value_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_format
或 value_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
进行衡量。如需了解详情,请参阅这篇帮助中心文章:count
和 count_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 聚合函数都不会返回日期。一种常见的例外情况是日期维度的 MIN
或 MAX
。
使用 type: date
创建日期上限或下限
如果您想创建衡量日期的最大值或下限,那么您最初可能会认为效果衡量应使用 type: max
或 type: min
。不过,这些测量类型仅与数字字段兼容。相反,您可以通过定义测量值 type: date
并将最大日期或最小日期封装在 MIN()
或 MAX()
函数的 sql
参数中引用的日期字段,来捕获日期的最大值或最小值。
假设您有一个名为 updated
的type: 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
可以省略,并且该值会被视为字符串,因为 string
是 type
的默认值。但是,如果您使用 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
参数来指定作为创建列表依据的维度。
用法如下:
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: date
的 sql
参数中的 MAX()
函数来捕获最大日期,如前面 date
部分的示例所示。
您可以使用 value_format
或 value_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_format
或 value_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_format
或 value_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: date
的 sql
参数中使用 MIN()
函数来捕获最小值,就像在 MAX()
中使用 type: date
指标来捕获最大日期一样。此信息之前显示在本页面的 date
部分,其中包括使用 sql
参数中的 MAX()
函数查找最大日期的示例。
您可以使用 value_format
或 value_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_format
或 value_format_name
参数来设置 type: number
字段的格式。
例如,以下 LookML 基于 total_sale_price
和 total_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_format
或 value_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_format
或 value_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_format
或 value_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_format
或 value_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_format
或 value_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
,因为 string
是 type
的默认值。
sum
type: sum
:将给定字段的值相加。它类似于 SQL 的 SUM
函数。不过,与编写原始 SQL 不同,即使查询的联接包含扇出,Looker 也会正确计算总和。
type: sum
衡量的 sql
参数可以采用产生数字表列、LookML 维度或 LookML 维度组合的任何有效 SQL 表达式。
您可以使用 value_format
或 value_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_format
或 value_format_name
参数来设置 type: sum_distinct
字段的格式。
yesno
type: yesno
会创建一个字段来指示某些内容是 true 还是 false。这些值在探索界面中显示为是和否。
type: yesno
衡量的 sql
参数接受计算结果为 TRUE
或 FALSE
的有效 SQL 表达式。如果条件的计算结果为 TRUE
,则系统会向用户显示是;否则,会显示 No。
type: yesno
测量的 SQL 表达式必须仅包含聚合,即 SQL 聚合或对 LookML 测量的引用。如果您要创建 yesno
字段,使其包含对 LookML 维度或非聚合的 SQL 表达式的引用,请使用带有 type: yesno
的维度,而不是测量值。
与使用 type: number
的测量类似,使用 type: yesno
的测量不会进行任何汇总;它只引用其他汇总。
例如,以下 total_sale_price
衡量指标是订单中商品的总售价的总和。第二个名为 is_large_total
的衡量指标为 type: yesno
。is_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 ;;
}