同比 (PoP) 分析是一种分析模式,用于衡量当前的情况,并将其与过去可比较时间段内的相同衡量结果进行比较。
对于支持时间段环比指标的方言,Looker 开发者可以将时间段环比指标添加到 LookML 项目中,以便在相应的 Looker 探索中进行时间段环比分析。
例如,以下 Looker 探索查询显示了当月创建的订单数量,以及去年创建的订单数量、与去年的差值和与去年的百分比变化等 PoP 指标。您可以抽查值来验证同比比较。例如,2012-03
的去年订单数的值与 2011-03
的订单数的值相同:
如需向 LookML 项目添加同比变化指标,Looker 开发者必须创建 type: period_over_period
的 measure
,并添加本页面下一部分中介绍的子形参。
例如,以下是用于提供上一年订单数量的 PoP 指标的 LookML:
measure: order_count_last_year {
type: period_over_period
description: "Order count from the previous year"
based_on: orders.count
based_on_time: orders.created_year
period: year
kind: previous
}
此 PoP 指标具有以下属性:
- 它使用
based_on: orders.count
定义,因此 PoP 指标将提供有关上一个时间段的订单数量的数据。 - 它定义为
kind: previous
,这意味着它提供的是上一个时间段的订单数,而不是上一个时间段的订单数差值或上一个时间段的订单数变化百分比。 - 该参数使用
period: year
定义,因此它将提供去年同期相应时间段的订单数量。
PoP 指标的子形参
PoP 衡量指标是 type: period_over_period
的 measure
,包含以下部分中所述的子形参:
如探索包含 PoP 指标的查询部分中所述,PoP 指标会根据 PoP 指标的 LookML 定义和探索查询中的字段来计算其值。因此,在 LookML 中创建同比变化指标时,您应遵循以下最佳实践:
- 在 PoP 指标的名称或指标的
description
子形参中,向探索用户提供 PoP 指标的period
指示。 - 在 PoP 指标的名称或指标的
description
子形参中,向探索用户提供 PoP 指标的based_on
指标。
例如,以下 PoP 指标名为 order_count_last_year
,并包含说明,让用户知道该指标提供的是上一年的订单数量:
measure: order_count_last_year {
type: period_over_period
description: "Order count from the previous year"
based_on: orders.count
based_on_time: orders.created_year
period: year
kind: previous
}
based_on
使用 based_on
字段指定 PoP 指标所依据的 LookML 度量。例如,如需基于 orders.count
字段计算 PoP 指标,您应输入以下内容:
based_on: orders.count
基于 orders.count
的 PoP 指标将提供有关之前时间段的订单数量信息,以便您比较当前时间段和之前时间段的销售数量。
您在 based on
字段中指定的 LookML 度量必须是以下类型的度量之一:
average
average_distinct
count
count_distinct
list
max
median
median_distinct
number
min
percentile
percentile_distinct
sum
sum_distinct
based_on_time
使用 based_on_time
子形参为 Looker 提供一个时间字段,以便 Looker 可以使用该字段来计算 PoP 指标值。此时间字段可以是以下任一值:
- 基于时间的维度。如果您在
based_on_time
子参数中指定了基于时间的维度,则用户必须在所有使用 PoP 指标的查询中包含完全相同的基于时间的维度。此外,基于时间的维度的时间范围必须等于或小于 PoP 指标的period
值。例如,如果使用based_on_time: created_month
定义了 PoP 指标,则 PoP 指标的period
值不能为week
或date
。 type: time
的维度组的以下时间范围之一:year
fiscal_year
month
fiscal_quarter
quarter
week
date
raw
如果您在 based_on_time
子参数中指定维度组时间范围,那么您使用的具体时间范围无关紧要,您只需将 PoP 指标指向 type: time
的维度组,以便 PoP 指标可以使用维度组的底层时间戳。您无法指定维度组为 type: duration
的时间范围;系统不支持时长类型维度组,并且会在“探索”中生成运行时错误。
kind
使用 kind
参数指定您希望 PoP 指标对上一个周期执行的计算类型。您可以为 kind
指定以下某个值:
previous
:(默认)上一个周期的值。difference
:周期之间的差值(当前周期减去上一个周期)。relative_change
:与上一时间段相比的百分比变化。百分比变化的计算公式如下:$$ relativeChange = (current - previous)/previous $$
period
使用 period
子参数指定 PoP 指标的频次,即您希望在比较中回溯多长时间。例如,使用 period: year
定义的 PoP 指标将显示上年的值。如果您针对每月订单数量运行探索查询,period: year
年同比指标将显示上一年同月的值,以便您将 2025 年 11 月的订单数量与 2024 年 11 月的销售数量进行比较。
period
子参数支持以下值:
year
fiscal_year
quarter
fiscal_quarter
month
week
date
value_to_date
使用 value_to_date
子形参可指明 Looker 是否应使用在运行查询时当前时间范围内已过去的时间量来计算 PoP 度量的值。value_to_date
子形参可以是 no
(默认值)或 yes
。
- 如果值为
no
,则在汇总数据时会假定整个时间范围窗口。 - 值为
yes
时,系统会计算当前时间段内的观测时长,并将其应用于 PoP 指标。
例如,如果月度环比 PoP 指标定义为 value_to_date: yes
,那么在 6 月 6 日 13:10:00,如果您运行包含 PoP 指标和日期时间范围维度的探索查询,Looker 会将 6 月 6 日已过去的时间(13 小时 10 分 0 秒)应用于查询中每个日期的计算。对于每个日期,Looker 将提供前 13 小时 10 分钟的值。
如果您有一个使用 value_to_date: no
定义的相同 PoP 指标,并且您在 6 月 6 日 13:10:00 运行了相同的探索查询,Looker 将使用每个日期可用的所有数据来计算 PoP 的值。如果您尝试比较 6 月 6 日与上个月 6 日的值,请注意,由于 6 月 6 日尚未结束,因此 13:10:00 之后可能会有更多数据。
如需查看 value_to_date: yes
如何影响探索查询中的结果,请参阅value_to_date
如何影响 PoP 指标值。
如包含 PoP 指标的探索查询的要求部分中所述,当您运行包含 PoP 指标的探索查询时,Looker 会自动将查询中的最小时间范围粒度应用于 PoP 指标所用的时间范围。对于使用 value_to_date: yes
定义了 PoP 度量的探索查询,Looker 会提取查询中最小的时间框架维度,计算运行查询时已过去的时间框架部分,然后将该部分应用于 PoP 度量的所有值。
探索包含 PoP 指标的查询
系统针对 PoP 指标执行的计算基于 PoP 指标的 LookML 定义,还基于探索查询本身中指定的时间范围;PoP 指标会根据探索查询中选择的时间范围调整其计算。例如,如果 PoP 指标定义为 period: year
,并且探索查询包含 orders.created_month
时间范围维度,则 PoP 指标将计算月度值,比较 2025 年 1 月与 2024 年 1 月。如果您想查看年度值,则必须运行包含 PoP 指标且仅包含 orders.created_year
时间范围的探索查询。
以下是一些示例,展示了 PoP 指标的 period
如何与探索查询中选择的时间范围互动:
- 如果使用
period: year
定义了同比变化指标,并且您运行的探索查询的时间范围为季度,则同比变化指标将返回上一年同一季度的值(例如,将 2025 年第 1 季度与 2024 年第 1 季度进行比较)。 - 如果使用
period: year
定义了同比变化百分比指标,并且您运行的探索查询的时间范围为“月”,则同比变化百分比指标将返回上一年同月的值(例如,2025 年 4 月与 2024 年 4 月相比)。 - 如果某个 PoP 指标定义为
period: month
,并且您运行的探索查询的时间范围为“月”,则该 PoP 指标将返回上个月的值(例如,2025 年 4 月与 2025 年 3 月的比较)。
包含时间段环比指标的探索查询的要求
由于同比变化衡量指标会根据同比变化衡量指标的 LookML 定义以及您在探索查询中选择的字段进行计算,因此在包含同比变化衡量指标的探索查询中,您至少必须包含以下字段:
- PoP 指标。
- 适合与 PoP 指标关联的
period
的时间维度。时间维度可以从探索的字段选择器中或在探索的过滤条件中包含在查询中:- PoP 指标查询支持的日期或更长的时间范围粒度,例如月份、季度或年份。PoP 指标查询不支持时间范围为小时或分钟的维度。
- 如果 PoP 指标是使用属于维度组的时间范围
based_on_time
定义的,则探索查询必须包含来自同一维度组的时间范围,该时间范围使用的时长必须等于或小于 PoP 指标的period
参数中指定的时长。您可以在探索中添加维度组(通过从探索的字段选择器中选择维度组),也可以按维度组进行过滤。例如,如果 PoP 指标的based_on_time
值是根据orders.created
维度组的时间范围定义的,并且 PoP 指标是根据period: month
定义的,那么探索查询必须包含orders.created
维度组中等于或小于一个月的时间范围,例如orders.created_date
。探索查询中的时间范围必须匹配或更小,因为您无法对一年时间范围进行月度比较。 - 如果 PoP 指标是使用
based_on_time
(即基于时间的维度)定义的,那么探索查询必须包含完全相同的基于时间的维度,方法是包含探索字段选择器中的相应维度,或者为该维度指定过滤条件。基于时间的维度必须与 PoP 指标的period
参数中指定的时间范围相同或更小。例如,如果 PoP 指标定义为based_on_time: created_date
,而 PoP 指标定义为period: month
,则探索查询必须包含created_date
维度。
如果 PoP 指标是使用属于维度组的时间段 based_on_time
定义的,请注意探索查询中时间段的以下要求:
- 探索查询中的时间范围必须等于或小于 PoP 指标的
period
参数中指定的时间范围。例如,如果 PoP 指标的based_on_time
是根据orders.created
维度组的时间范围定义的,并且 PoP 指标是根据period: month
定义的,那么探索查询必须包含orders.created
维度组的时间范围,该时间范围必须小于或等于一个月,例如orders.created_date
。探索查询中的时间范围必须更小,例如,您无法对一年时间范围进行月度比较。 - 探索查询中的时间范围本身必须包含时间戳信息。例如,维度组的
year
、month
和date
时间段会提供实际的时间戳信息。相比之下,day_of_week
时间框架是从底层时间戳中抽象出来的,可提供Wednesday
等值。同样,month_name
、month_num
和day_of_month
等时间段本身不提供时间戳信息,因此 PoP 指标无法使用它们来计算上个周期的值。不过,如果您在探索查询中添加时间戳(例如date
),系统就会为 PoP 指标提供时间戳信息,以便该指标计算上一个周期的值。您还可以在探索查询中添加day_of_week
时间范围,因为 PoP 指标可以使用date
时间范围信息进行计算。
只要您在探索查询中满足这些要求,就可以在探索查询中添加其他字段和时间范围维度,但探索查询中的所有时间范围都必须等于或小于 PoP 指标的 period
时间范围。当您运行包含 PoP 指标的探索查询时,Looker 会自动将查询中的最小时间范围粒度应用于 PoP 指标所用的时间范围。在本页开头显示的探索示例中,所有 PoP 指标都已在 LookML 中使用 period: year
定义。这意味着,无论在探索查询中选择哪个时间段(在本例中为月度时间段),PoP 指标都会返回上一年同一时间段的结果。
如果您想在探索中查看您的 PoP 指标支持哪些时间范围,可以测试不同的时间范围,而无需运行查询。点击探索的数据部分的 SQL 标签页,然后从探索的字段选择器中添加字段和过滤条件。如果 PoP 指标无法使用所选字段和过滤条件计算查询,SQL 标签页会显示一条消息,指出无法生成 SQL。
如果您运行的查询无法生成 SQL,探索窗口会返回一条错误消息,其中包含详细信息以及指向相关 LookML 的链接。
示例
以下部分展示了一些不同的 PoP 指标和探索查询示例:
将数量与同比和环比 PoP 指标进行比较
以下是示例 total_births
度量、type:time
的 birth
维度组以及基于 total_births
度量且使用 birth
维度组作为其 based_on_time
字段的两个 PoP 度量的 LookML:
dimension_group: birth {
type: time
timeframes: [raw, time, date, week, month, quarter, year]
sql: ${TABLE}.birth_date ;;
}
measure: total_births {
type: sum
sql: ${TABLE}.total_births ;;
}
measure: total_births_last_year {
type: period_over_period
kind: previous
based_on: total_births
based_on_time: birth_year
period: year
value_to_date: no
value_format_name: decimal_0
}
measure: total_births_last_month {
type: period_over_period
kind: previous
based_on: total_births
based_on_time: birth_year
period: month
value_to_date: no
value_format_name: decimal_0
}
请注意有关这些字段的以下事项:
- 这两个 PoP 指标都是使用
kind: previous
定义的,因此它们都提供上一个周期的指标值。 - 这两个 PoP 指标都使用
value_to_date: no
定义,因此它们都会计算整个时间范围(即查询中的最小时间范围粒度)的指标值。 - 这两个 PoP 指标都是使用
based_on_time: birth_year
定义的,因此它们都使用birth
维度组的基础时间戳。 total_births_last_year
PoP 指标使用period: year
定义,total_births_last_month
PoP 指标使用period: month
定义。
以下是一个探索查询,其中包含全部三个指标和 birth_month
维度时间段:
请注意以下有关“探索”结果的事项:
- 探索查询中的最小维度时间范围为
birth_month
,因此 PoP 指标提供的是月度值。 - 在最新月份(即 2024-07)对应的行中,上个月的总出生人数值显示的是上个月(即 2024-06)的总出生人数。您可以查看 2024-06 行的总出生人数值来验证这一点。这两个值一致。
- 在最新月份(2024-07)对应的行中,去年同月出生总数值显示的是上一年(2023 年)同一月份(07 月)的出生总数。您可以查看 2023 年 7 月这一行的总出生人数值,以验证这一点。这两个值一致。
value_to_date
对不同时期变化衡量值的影响
与之前的示例类似,以下是 total_births
度量和 type:time
的 birth
维度组的 LookML,以及基于 total_births
度量且使用 birth
维度组作为其 based_on_time
字段的两个 PoP 度量。不过,在此示例中,total_births_last_year_value_to_date
PoP 指标使用 value_to_date: yes
定义,total_births_last_year
PoP 指标使用 value_to_date: no
定义:
dimension_group: birth {
type: time
timeframes: [raw, time, date, week, month, quarter, year]
sql: ${TABLE}.birth_date ;;
}
measure: total_births {
type: sum
sql: ${TABLE}.total_births ;;
}
measure: total_births_last_year {
type: period_over_period
kind: previous
based_on: total_births
based_on_time: birth_year
period: year
value_to_date: no
value_format_name: decimal_0
}
measure: total_births_last_year_value_to_date {
type: period_over_period
kind: previous
based_on: total_births
based_on_time: birth_year
value_to_date: yes
period: year
value_format_name: decimal_0
}
以下是一个探索查询,其中包含全部三个指标和 birth_year
维度时间范围。此探索查询是在 6 月 4 日 16:25:08 运行的,这对于 value_to_date: yes
PoP 指标非常重要。
“探索”结果显示了 value_to_date
子形参如何改变了 PoP 指标的计算方式:
请注意以下有关“探索”结果的事项:
- 在最新年份(即 2024 年)对应的行中,去年总出生人数值显示的是上一年(即 2023 年)的总出生人数。您可以查看 2023 年行的总出生人数值,验证计算结果。这两个值一致。
- 在最新年份(即 2024 年)对应的行中,“去年至今的总出生人数”值小于“去年的总出生人数”值。这是因为探索查询是在 6 月 4 日 16:25:08 运行的,并且由于
total_births_last_year_value_to_date
变化百分比指标是使用value_to_date: yes
定义的,因此 Looker 在计算年度值时,仅使用了截至 6 月 4 日 16:25:08 的数据。
过滤包含 PoP 指标的探索查询
请注意以下事项,以便过滤包含 PoP 指标的探索查询:
- 对于包含同比增幅指标的探索查询,系统支持过滤。不过,您无法按 PoP 指标本身进行过滤。例如,在第一个示例中,探索查询的是
birth_month
维度以及total_births
、total_births_last_year
和total_births_last_month
PoP 指标,您无法根据total_births
、total_births_last_year
或total_births_last_month
PoP 指标过滤该查询。 - 如果您按与 PoP 指标的
based_on_time
参数相关联的字段进行过滤,并且过滤条件的时间范围比查询的时间范围更精细,则 PoP 指标将仅显示查询时间范围中过滤值部分的结果。例如,如果您查询orders.created_year
维度,并按 1 月过滤查询,则对于每个年份,PoP 指标将仅显示 1 月的值。这可能会被误认为是全年的结果。 - 对于同比增幅指标探索查询,为了计算同比增幅指标的数据,Looker 会检索额外时间段的数据,该时间段的精细程度至少与查询的时间段精细程度相同。例如,如果您创建的探索查询包含月度维度、使用
period: year
定义的 PoP 度量,以及过去 6 个月的过滤条件,Looker 会识别查询中最小的粒度,在此示例中,该粒度为 PoP 度量的year
时间段。在此示例中,Looker 将检索过去 6 个月的数据以及额外一年的数据,以便将过去 6 个月中的每个月与上一年中的同一月份进行比较。 - 如包含 PoP 指标的探索查询的要求中所述,包含 PoP 指标的探索查询必须具有适合与 PoP 指标关联的
period
的时间维度。如果您未从探索的字段选择器中选择时间维度,Looker 可以从探索的过滤条件中的时间维度派生出所需的信息。在这种情况下,Looker 会按过滤条件的时间维度对探索查询结果进行排序。
使用时间段环比变化指标的可视化图表
建议为 PoP 指标使用表格图表可视化图表。其他可视化图表选项也可能适用,具体取决于探索查询中的字段。
如果您使用的不是表格图,请确保可视化图表清晰明了。由于 PoP 指标提供与之前时间段的比较,因此包含 PoP 指标的可视化图表可能会产生误导。例如,如果将同比 PoP 指标定义为 kind: previous
,则会显示今年日期对应的去年的值。如果您的探索查询包含当年的值以及同比 PoP 指标,则可视化图表中将显示当年的两个值。
如果您使用的可视化图表不是表格图表,请验证您的可视化图表是否清楚地表明任何环比指标都是与之前时间段的比较。
PoP 指标的限制
请注意 PoP 指标的以下限制:
- 只有使用新的 LookML 运行时的 LookML 项目支持 PoP 度量。如果您的实例启用了 使用旧版 LookML 运行时旧版功能,则项目的清单文件必须包含
new_lookml_runtime:yes
语句。 - Looker Studio 中的 Looker 连接器不支持 PoP 指标。
- PoP 指标必须基于汇总指标,如
based_on
部分中所述。您无法基于非汇总指标来计算同比变化百分比。 - 对于启用了 BI Engine 对称聚合实验性功能的实例上的 BigQuery 连接,系统支持 PoP 指标,但包含 PoP 指标的 SQL 查询不会使用 BI Engine 对称聚合功能。
- PoP 指标不支持同群分析。
- PoP 指标不支持滚动计算。
- PoP 指标始终将当前时间段与前一时间段进行比较。您无法将同比指标配置为将当前周期与上一个周期以外的其他周期进行比较。例如,您无法创建 PoP 指标来比较去年 5 月与今年 12 月。
- 自定义日历(例如零售 4-5-4 日历)不支持 PoP 指标。如需了解 PoP 衡量支持的时间段,请参阅
period
部分。 - 不支持使用自定义周期(例如当前两周与前两周的比较)来衡量 PoP 指标。
在 PoP 指标的参数中,不支持使用 Liquid 参数。不过,如果 PoP 的
based_on
或based_on_time
字段指向使用 Liquid 定义的维度,则系统会处理该 Liquid。以下 Looker 功能不支持 PoP 指标:
PoP 指标不能用于创建自定义字段。
在包含 PoP 指标的探索查询中,您无法选择周时间范围,除非 PoP 指标是使用
period: week
或period: date
定义的。如果 PoP 指标的周期是根据会计时间范围定义的,则不能在采用非会计时间范围的探索查询中使用该指标。此外,如果 PoP 衡量指标的周期是使用非财政时间范围定义的,则不能在包含财政时间范围维度的查询中使用这些指标。
PoP 度量支持财政月偏移,即 PoP 度量的
based_on_time
参数将从与探索相关联的 LookML 模型文件中继承fiscal_month_offset
值。如果您使用fiscal_year
或fiscal_quarter
定义了 PoP 指标,则只有当探索查询指定了fiscal_year
或fiscal_quarter
时间范围时,该 PoP 指标才会在探索查询中受支持。在这种情况下,系统会遵循fiscal_offset_month
。PoP 指标的
period
必须等于或大于探索查询中选择的时间范围。例如,对于使用period: month
定义的 PoP 指标,探索查询必须具有月份或更小的时间范围维度,例如周或天。
PoP 指标支持的数据库方言
下表显示了 Looker 最新版本中哪些方言支持 PoP 度量:
方言 | 是否支持? |
---|---|
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 | 否 |