Offset

⚠️ Offset 函數目前不適用於 MySQL/MariaDB、MongoDB 和 Druid。

Offset 函數會傳回不同列中表達式的值。Offset 只能在查詢產生器的「摘要」步驟中使用(您無法使用 Offset 建立自訂欄位)。

語法:Offset(expression, rowOffset)

expression 是要從不同列取得的值。

rowOffset 是相對於目前列的數字。例如,-1 代表前一列,或 1 代表下一列。

範例:Offset(Sum([Total]), -1) 會從前一列取得 Sum([Total]) 的值。

分組的順序很重要

由於 Offset 參考其他列,因此分組的順序很重要(分組是「摘要」步驟中「依群組」區段中的群組)。Metabase 將先依第一個群組排序,然後依任何其他分組進行分割。例如,如果您想查看依產品類別和時間劃分的訂單計數,以及上一期間依產品類別劃分的計數,則應先依 Created At 分組,然後再依產品類別分組。

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 列中的任何值。

資料類型 Offset 傳回
字串
數字
時間戳記
布林值
JSON

使用 Offset 的年度 (YoY) 時間序列比較範例

在範例資料庫中,您可以使用 Offset 來比較年度 (YoY) 訂單計數。

首先,依「總計加總」進行摘要。然後再次摘要該加總,這次使用 Offset 抓取前一列的值。

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

然後依年份將結果依 Created At 分組

Comparing year over year

產生

Year over year order sum of order totals

有了這些 offset(「前一期間」欄位中的加總),我們就可以建立自訂欄位來計算年度加總之間的差異等項目

[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

上述表達式會將本期間的總計,加上前兩個期間的總計(offset 分別為 -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 版本的文件。