衍生資料表是指查詢結果,當作衍生資料表是資料庫中的實體資料表。原生衍生資料表是根據您使用 LookML 字詞定義的查詢建立。這與以 SQL 為基礎的衍生資料表不同,後者是根據您使用 SQL 術語定義的查詢建立。與以 SQL 為基礎的衍生資料表相比,原生衍生資料表在建構資料模型時,更容易閱讀及理解。詳情請參閱「Looker 中的衍生資料表」說明文件頁面中的「原生衍生資料表和以 SQL 為基礎的衍生資料表」一節。
在 LookML 中,原生和以 SQL 為基礎的衍生資料表都是使用 derived_table
參數在檢視畫面層級定義。不過,使用原生衍生資料表時,您不需要建立 SQL 查詢。而是使用 explore_source
參數,指定要用來建立衍生資料表的探索、所需的資料欄和其他所需特徵。
您也可以讓 Looker 根據 SQL Runner 查詢建立衍生資料表 LookML,如「使用 SQL Runner 建立衍生資料表」說明文件頁面所述。
使用探索功能開始定義原生衍生資料表
從探索開始,Looker 可以為所有或大部分的衍生資料表產生 LookML。只要建立探索,然後選取要納入衍生表格的所有欄位即可。接著,如要產生原生衍生資料表 LookML,請按照下列步驟操作:
選取「探索動作」齒輪選單,然後選取「取得 LookML」。
點選「衍生資料表」分頁標籤,查看 LookML 建立探索的本機衍生資料表。
複製 LookML。
複製產生的 LookML 後,請將其貼入檢視檔案:
按一下 Looker IDE 專案檔案清單頂端的 +,然後選取「Create View」。或者,您也可以按一下資料夾的選單,然後選取選單中的「Create View」,在資料夾中建立檔案。
將檢視畫面名稱設為有意義的名稱。
視需要變更資料欄名稱、指定衍生欄,以及新增篩選器。
在探索中使用
type: count
的評估值時,視覺化工具會使用檢視名稱標示結果值,而非「Count」一詞。為避免混淆,請將檢視畫面名稱改為複數。如要變更檢視名稱,請在圖表設定的「系列」下方選取「顯示完整欄位名稱」,或是使用view_label
參數,並加上檢視名稱的複數版本。
在 LookML 中定義原生衍生資料表
無論您使用 SQL 或原生 LookML 中宣告的衍生資料表,derived_table
查詢的輸出結果都是包含一組欄的資料表。衍生資料表以 SQL 表示時,SQL 查詢會隱含輸出資料欄名稱。舉例來說,下列 SQL 查詢會產生輸出資料欄 user_id
、lifetime_number_of_orders
和 lifetime_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_id
、lifetime_customer_value
和 lifetime_number_of_orders
。您不需要手動以 SQL 編寫查詢,Looker 會使用指定的探索 order_items
和該探索的部分欄位 (order_items.user_id
、order_items.total_revenue
和 order_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_value
和 lifetime_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_id
、order_id
和 created_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_source
的 dev_filters
子參數搭配原生衍生資料表。您可以使用 dev_filters
參數指定 Looker 只套用至衍生資料表的開發版本的篩選器,這表示您可以建立較小的篩選資料表版本,用於執行迭代和測試,而不需要在每次變更後等待完整資料表建構完成。
dev_filters
參數會與 filters
參數搭配運作,將所有篩選器套用至資料表的開發版本。如果 dev_filters
和 filters
都為同一欄指定篩選器,則 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_source
的 bind_all_filters
子參數,將探索的所有執行階段篩選器傳遞至原生衍生表格子查詢。詳情請參閱 explore_source
參數說明文件頁面。
排序及限制原生衍生資料表
sorts: [order_items.count: desc]
limit: 10
請注意,探索可能會以與基礎排序不同的順序顯示資料列。
將原生衍生資料表轉換為不同時區
您可以使用 timezone
子參數指定原生衍生資料表的時區:
timezone: "America/Los_Angeles"
使用 timezone
子參數時,原生衍生表格中的所有以時間為準的資料都會轉換為您指定的時區。如需支援的時區值清單,請參閱 timezone
值說明文件頁面。
如果您未在原生衍生表定義中指定時區,原生衍生表就不會對時間資料執行任何時區轉換作業,而是會預設為資料庫時區。
如果原生衍生資料表不是「持續性」,您可以將時區值設為 "query_timezone"
,自動使用目前執行查詢的時區。