偏移

⚠️ 目前,MySQL/MariaDB、MongoDB和Druid不支持`Offset`函数。

`Offset`函数返回不同行中的表达式值。`Offset`只能在查询构建器的Summarize步骤中使用(您不能使用`Offset`来创建自定义列)。

语法:Offset(表达式, 行偏移)

表达式是从不同行获取的值。

行偏移是相对于当前行的数字。例如,-1表示上一行,或1表示下一行。

示例:Offset(Sum([Total]), -1)将从上一行获取Sum([Total])的值。

分组的顺序很重要

因为Offset引用其他行,所以分组的顺序很重要(分组是汇总步骤中“分组依据”部分的组)。Metabase将按第一个组排序,然后按任何附加的分组进行分区。例如,如果您想按产品类别查看订单数随时间的变化,以及前期的产品类别计数,您应该首先按Created At分组,然后按产品类别分组。

数据类型

Offset函数返回偏移行中的任何值。

数据类型 Offset返回
字符串
数字
时间戳
布尔值
JSON

使用Offset进行跨年度时间序列比较的示例

在样本数据库中,您可以使用Offset来比较年度订单数的年度变化(YoY)。

首先,按总金额汇总。然后再次汇总该汇总,这次使用Offset来获取上一行的值。

Offset(Sum([Total]), -1)

然后按年将结果分组为Created At

Comparing year over year

结果是

Year over year order sum of order totals

有了这些偏移量(“前期”列中的总和),然后我们可以创建自定义列来计算如年度总和之间的差异等

[Sum of total] - [Previous period]

以及年度间的百分比变化

[Difference] / [Previous period] * 100

Difference and percentage change

使用Offset计算移动平均值的示例

您可以使用带有Offset的自定义表达式来计算移动平均值。

例如,假设您想计算过去三个月订单总金额的移动平均值。您可以创建一个自定义表达式来计算这些移动平均值

(Sum([Total]) + Offset(Sum([Total]), -1) + Offset(Sum([Total]), -2)) / 3

上述表达式将本期的总金额加上前两个期间的总金额(偏移量为-1-2),然后除以三,以获取这些期间的平均值。

Rolling average

SQL

Offset函数与SQL中的LAGLEAD窗口函数进行比较。

例如,如果您想创建一个包含两个系列的折线图,用于比较a)本月的订单数量与b)上个月的订单数量,您会先count本月的订单,然后使用一个offset表达式来计数上个月的订单,如下所示

Offset(count, -1)

在底层,Metabase会将该Offset表达式转换为LAG窗口函数,如下查询所示

SELECT
  "source"."CREATED_AT" AS "CREATED_AT",
  COUNT(*) AS "count",
  LAG(COUNT(*), 1) OVER (

ORDER BY
      "source"."CREATED_AT" ASC
  ) AS "Order count previous period"
FROM
  (
    SELECT
      DATE_TRUNC('month', "PUBLIC"."ORDERS"."CREATED_AT") AS "CREATED_AT"
    FROM
      "PUBLIC"."ORDERS"
  ) AS "source"
GROUP BY
  "source"."CREATED_AT"
ORDER BY
  "source"."CREATED_AT" ASC

进一步阅读

阅读Metabase其他版本的文档。

想改进这些文档? 提出更改。