建立原生衍生資料表

衍生資料表是一種查詢,其結果會當做資料庫中的實體資料表使用。原生衍生資料表是以您使用 LookML 字詞定義的查詢為基礎。這與以 SQL 為基礎的衍生資料表不同,後者是以您使用 SQL 條件定義的查詢為基礎。相較於以 SQL 為基礎的衍生資料表,原生衍生資料表更容易讀取和瞭解,方便您建立資料模型。詳情請參閱「Looker 中的衍生資料表」說明頁面的「原生衍生資料表和以 SQL 為基礎的衍生資料表」一節。

原生和以 SQL 為基礎的衍生資料表,都是在 LookML 中使用檢視區塊層級的 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 中,按一下專案檔案清單頂端的「+」,然後選取「建立檢視區塊」。或者,您也可以按一下資料夾選單,然後從選單中選取「建立檢視畫面」在資料夾內建立檔案

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

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

在「探索」中,如果使用 type: count指標,視覺化會以檢視區塊名稱標示結果值,而不是「計數」一詞。為避免混淆,請將檢視畫面名稱改為複數。如要變更檢視名稱,請在視覺化設定中選取「系列」下方的「顯示完整欄位名稱」,或使用 view_label 參數,並將檢視名稱改為複數形式。

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

無論您使用 SQL 中宣告的衍生資料表或原生 LookML,derived_table's 查詢的輸出內容都是一組資料欄的資料表。以 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 參數指向「探索」,並定義原生衍生資料表的資料欄和其他特徵。

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

不過,如果您想在 Looker IDE 中啟用自動建議和即時欄位驗證,或是擁有複雜的 LookML 專案,其中有多個同名的探索或潛在的循環參照,可以使用 include 參數指向探索定義的位置。

探索通常是在模型檔案中定義,但如果是原生衍生資料表,最好為探索建立個別檔案。如「建立探索檔案」說明文件所述,LookML 探索檔案的副檔名為 .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 參數的「探索」中不存在的資料欄。每個 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 宣告。

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

下列範例會建立原生衍生資料表,其中包含 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",自動使用目前執行查詢的時區。