建立原生衍生資料表

衍生資料表是指查詢結果,當作衍生資料表是資料庫中的實體資料表。原生衍生資料表是根據您使用 LookML 字詞定義的查詢建立。這與以 SQL 為基礎的衍生資料表不同,後者是根據您使用 SQL 術語定義的查詢建立。與以 SQL 為基礎的衍生資料表相比,原生衍生資料表在建構資料模型時,更容易閱讀及理解。詳情請參閱「Looker 中的衍生資料表」說明文件頁面中的「原生衍生資料表和以 SQL 為基礎的衍生資料表」一節。

在 LookML 中,原生和以 SQL 為基礎的衍生資料表都是使用 derived_table 參數在檢視畫面層級定義。不過,使用原生衍生資料表時,您不需要建立 SQL 查詢。而是使用 explore_source 參數,指定要用來建立衍生資料表的探索、所需的資料欄和其他所需特徵。

您也可以讓 Looker 根據 SQL Runner 查詢建立衍生資料表 LookML,如「使用 SQL Runner 建立衍生資料表」說明文件頁面所述。

使用探索功能開始定義原生衍生資料表

從探索開始,Looker 可以為所有或大部分的衍生資料表產生 LookML。只要建立探索,然後選取要納入衍生表格的所有欄位即可。接著,如要產生原生衍生資料表 LookML,請按照下列步驟操作:

  1. 選取「探索動作」齒輪選單,然後選取「取得 LookML」

  2. 點選「衍生資料表」分頁標籤,查看 LookML 建立探索的本機衍生資料表。

  3. 複製 LookML。

複製產生的 LookML 後,請將其貼入檢視檔案:

  1. 開發模式中,前往專案檔案

  2. 按一下 Looker IDE 專案檔案清單頂端的 +,然後選取「Create View」。或者,您也可以按一下資料夾的選單,然後選取選單中的「Create View」,在資料夾中建立檔案。

  3. 將檢視畫面名稱設為有意義的名稱。

  4. 視需要變更資料欄名稱、指定衍生欄,以及新增篩選器。

在探索中使用 type: count評估值時,視覺化工具會使用檢視名稱標示結果值,而非「Count」一詞。為避免混淆,請將檢視畫面名稱改為複數。如要變更檢視名稱,請在圖表設定的「系列」下方選取「顯示完整欄位名稱」,或是使用 view_label 參數,並加上檢視名稱的複數版本。

在 LookML 中定義原生衍生資料表

無論您使用 SQL 或原生 LookML 中宣告的衍生資料表,derived_table 查詢的輸出結果都是包含一組欄的資料表。衍生資料表以 SQL 表示時,SQL 查詢會隱含輸出資料欄名稱。舉例來說,下列 SQL 查詢會產生輸出資料欄 user_idlifetime_number_of_orderslifetime_customer_value

SELECT
  user_id
  , COUNT(DISTINCT order_id) as lifetime_number_of_orders
  , SUM(sale_price) as lifetime_customer_value
FROM order_items
GROUP BY 1

在 Looker 中,查詢會以「探索」為基礎,包含指標和維度欄位,並加入任何適用的篩選器,也可能指定排序順序。原生衍生表包含所有這些元素,以及資料欄的輸出名稱。

以下簡單範例會產生衍生資料表,其中包含三個資料欄:user_idlifetime_customer_valuelifetime_number_of_orders。您不需要手動以 SQL 編寫查詢,Looker 會使用指定的探索 order_items 和該探索的部分欄位 (order_items.user_idorder_items.total_revenueorder_items.order_count) 為您建立查詢。

view: user_order_facts {
  derived_table: {
    explore_source: order_items {
      column: user_id {
        field: order_items.user_id
      }
      column: lifetime_number_of_orders {
        field: order_items.order_count
      }
      column: lifetime_customer_value {
        field: order_items.total_revenue
      }
    }
  }
  # Define the view's fields as desired
  dimension: user_id {
    hidden: yes
  }
  dimension: lifetime_number_of_orders {
    type: number
  }
  dimension: lifetime_customer_value {
    type: number
  }
}

使用 include 陳述式啟用參照欄位

在原生衍生表格的檢視檔案中,您可以使用 explore_source 參數指向 Explore,並定義原生衍生表格的資料欄和其他特性。

在原生衍生資料表的檢視檔案中,您不需要使用 include 參數指向包含探索定義的檔案。如果沒有 include 陳述式,Looker IDE 就不會在建構原生衍生資料表時自動建議欄位名稱,也不會驗證欄位參照。您可以改用 LookML 驗證工具來驗證原生衍生資料表中參照的欄位。

不過,如果您想在 Looker IDE 中啟用自動建議和立即欄位驗證功能,或是您有複雜的 LookML 專案,其中包含多個同名或可能會產生循環參照的 Explore,您可以使用 include 參數指向 Explore 定義的位置。

探索通常會在模型檔案中定義,但在原生衍生資料表的情況下,為探索建立個別檔案會更清晰。LookML Explore 檔案的副檔名為 .explore.lkml,如「建立探索檔案」說明文件所述。這樣一來,您就能在原生衍生表格檢視檔案中加入單一探索檔案,而非整個模型檔案。

如果您想建立個別的探索檔案,並使用 include 參數指向原生衍生資料表檢視檔案中的探索檔案,請確認 LookML 檔案符合下列規定:

  • 原生衍生表格的檢視檔案應包含探索檔案。例如:
    • include: "/explores/order_items.explore.lkml"
  • Explore 檔案應包含所需的檢視畫面檔案。例如:
    • include: "/views/order_items.view.lkml"
    • include: "/views/users.view.lkml"
  • 模型應包含「探索」檔案。例如:
    • include: "/explores/order_items.explore.lkml"

定義原生衍生資料表欄

上一個範例所示,您可以使用 column 指定衍生資料表的輸出欄。

指定資料欄名稱

對於 user_id 欄,欄名稱必須與原始探索中指定欄位的名稱相符。

輸出資料表中的欄名通常會與原始探索中的欄位名稱不同。上述範例使用 order_items 探索功能,根據使用者產生生命週期價值計算結果。在輸出表格中,total_revenue 實際上是客戶的 lifetime_customer_value

column 宣告可支援宣告與輸入欄位不同的輸出名稱。舉例來說,下列程式碼會指示 Looker「從欄位 order_items.total_revenue 建立名為 lifetime_value 的輸出欄」:

column: lifetime_value {
  field: order_items.total_revenue
}

隱含的資料欄名稱

如果 field 參數未列入資料欄宣告,系統會假設該參數為 <explore_name>.<field_name>。舉例來說,如果您已指定 explore_source: order_items,則

column: user_id {
  field: order_items.user_id
}

相當於

column: user_id {}

為計算值建立衍生欄

您可以新增 derived_column 參數,指定 explore_source 參數的 Explore 中不存在的資料欄。每個 derived_column 參數都有一個 sql 參數,用於指定值的建構方式。

sql 計算可使用您使用 column 參數指定的任何欄。衍生資料欄無法包含匯總函式,但可以包含可在資料表單一資料列上執行的計算。

以下範例會產生與前一個範例相同的衍生資料表,但會新增計算 average_customer_order 資料欄,該資料欄會根據原生衍生資料表中的 lifetime_customer_valuelifetime_number_of_orders 資料欄計算而得。

view: user_order_facts {
  derived_table: {
    explore_source: order_items {
      column: user_id {
        field: order_items.user_id
      }
      column: lifetime_number_of_orders {
        field: order_items.order_count
      }
      column: lifetime_customer_value {
        field: order_items.total_revenue
      }
      derived_column: average_customer_order {
        sql:  lifetime_customer_value / lifetime_number_of_orders ;;
      }
    }
  }
  # Define the view's fields as desired
  dimension: user_id {
    hidden: yes
  }
  dimension: lifetime_number_of_orders {
    type: number
  }
  dimension: lifetime_customer_value {
    type: number
  }
  dimension: average_customer_order {
    type: number
  }
}

使用 SQL 窗型函式

部分資料庫方言支援視窗函式,特別是用於建立序號、主索引鍵、動態和累積總和,以及其他實用的多列計算。執行主要查詢後,系統會在單獨的傳遞中執行任何 derived_column 宣告。

如果資料庫方言支援窗型函式,您就可以在原生衍生資料表中使用這些函式。使用含有所需視窗函式的 sql 參數建立 derived_column 參數。參照值時,請使用原生衍生資料表中定義的資料欄名稱。

以下範例會建立原生衍生資料表,其中包含 user_idorder_idcreated_time 資料欄。接著,使用含有 SQL ROW_NUMBER() 窗口函式的衍生欄,計算包含顧客訂單序號的資料欄。

view: user_order_sequences {
  derived_table: {
    explore_source: order_items {
      column: user_id {
        field: order_items.user_id
      }
      column: order_id {
        field: order_items.order_id
      }
      column: created_time {
        field: order_items.created_time
      }
      derived_column: user_sequence {
        sql: ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_time) ;;
      }
    }
  }
  dimension: order_id {
    hidden: yes
  }
  dimension: user_sequence {
    type: number
  }
}

在原生衍生資料表中新增篩選器

假設您想建立衍生資料表,以便查看過去 90 天內的顧客價值。您想執行與前一個範例相同的計算,但只想納入過去 90 天內的購買交易。

只要在 derived_table 中新增篩選器,即可篩選過去 90 天內的交易。衍生資料表的 filters 參數使用與建立篩選的評估資料相同的語法。

view: user_90_day_facts {
  derived_table: {
    explore_source: order_items {
      column: user_id {
        field: order_items.user_id
      }
      column: number_of_orders_90_day {
        field: order_items.order_count
      }
      column: customer_value_90_day {
        field: order_items.total_revenue
      }
      filters: [order_items.created_date: "90 days"]
    }
  }
  # Add define view's fields as desired
  dimension: user_id {
    hidden: yes
  }
  dimension: number_of_orders_90_day {
    type: number
  }
  dimension: customer_value_90_day {
    type: number
  }
}

Looker 為衍生資料表寫入 SQL 時,篩選器會新增至 WHERE 子句。

此外,您也可以使用 explore_sourcedev_filters 子參數搭配原生衍生資料表。您可以使用 dev_filters 參數指定 Looker 只套用至衍生資料表的開發版本的篩選器,這表示您可以建立較小的篩選資料表版本,用於執行迭代和測試,而不需要在每次變更後等待完整資料表建構完成。

dev_filters 參數會與 filters 參數搭配運作,將所有篩選器套用至資料表的開發版本。如果 dev_filtersfilters 都為同一欄指定篩選器,則 dev_filters 會優先套用至表格的開發版本。

詳情請參閱「在開發模式中加快工作速度」。

使用範本篩選器

您可以使用 bind_filters 加入範本篩選器

bind_filters: {
  to_field: users.created_date
  from_field: filtered_lookml_dt.filter_date
}

這與在 sql 區塊中使用下列程式碼的效果相同:

{% condition filtered_lookml_dt.filter_date %} users.created_date {% endcondition %}

to_field 是套用篩選器的欄位。to_field 必須是基礎 explore_source 的欄位。

如果在執行階段有篩選器,from_field 會指定要從哪個欄位取得篩選器。

在前述 bind_filters 範例中,Looker 會將套用至 filtered_lookml_dt.filter_date 欄位的任何篩選器,套用至 users.created_date 欄位。

您也可以使用 explore_sourcebind_all_filters 子參數,將探索的所有執行階段篩選器傳遞至原生衍生表格子查詢。詳情請參閱 explore_source 參數說明文件頁面。

排序及限制原生衍生資料表

如有需要,您也可以排序限制衍生表格:

sorts: [order_items.count: desc]
limit: 10

請注意,探索可能會以與基礎排序不同的順序顯示資料列。

將原生衍生資料表轉換為不同時區

您可以使用 timezone 子參數指定原生衍生資料表的時區:

timezone: "America/Los_Angeles"

使用 timezone 子參數時,原生衍生表格中的所有以時間為準的資料都會轉換為您指定的時區。如需支援的時區值清單,請參閱 timezone說明文件頁面。

如果您未在原生衍生表定義中指定時區,原生衍生表就不會對時間資料執行任何時區轉換作業,而是會預設為資料庫時區

如果原生衍生資料表不是「持續性」,您可以將時區值設為 "query_timezone",自動使用目前執行查詢的時區。