Offset

⚠️ Offset 函数目前在 MySQL/MariaDB、MongoDB 和 Druid 中不可用。

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

语法:Offset(expression, rowOffset)

expression 是要从不同行获取的值。

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

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

分组的顺序很重要

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

Offset 不考虑缺失数据

Offset 只能引用您拥有的行,这意味着它可能会产生正确但意外的结果。 例如,假设您想将每天的计数与前一天进行比较。

以下表为例,其中 Previous 列由表达式 Offset(Count, -1) 创建

日期 计数 上一个
2022 年 10 月 1 日 6  
2022 年 10 月 2 日 3 6
2022 年 10 月 4 日 2 3

10 月 4 日的 Previous 列中的值为 3,这是上一行的值。 虽然基于数据是正确的,但上一行是 10 月2 日; 前一天 10 月 3 日没有数据。 如果您想使用 offset 来比较前几天(或几周,或其他),您需要确保您的数据包含您要比较的每个数据点的行。 在这种情况下,您的数据将需要包含每天的行,包括计数为零的日子。 如果您的数据中缺少日期,您可以将日历表加入到您的数据中,以确保每天在您的数据中都有一行。

数据类型

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

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

使用 Offset 的年度 (YoY) 时间序列比较示例

在示例数据库中,您可以使用 Offset 来比较订单计数同比 (YoY)。

首先,按“总计”求和进行汇总。 然后再次汇总该求和,这次使用 Offset 来获取上一行的值。

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

然后按 创建时间(按年)对结果进行分组

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 的文档。