本進階主題適用於已具備 SQL 和 LookML 知識的使用者。
Looker 會自動提供使用者建立篩選器的功能,讓他們根據維度和指標操控查詢。雖然這種方法適用於許多用途,但無法滿足所有分析需求。範本篩選器和 Liquid 參數可大幅擴充支援的可能用途。
從 SQL 的角度來看,維度和指標只能變更查詢中最外層的 WHERE
或 HAVING
子句。不過,您可能會發現自己想讓使用者操控 SQL 的其他部分。調整衍生資料表的一部分、調整要查詢的資料庫資料表,或是建立多用途的維度和篩選器,這些只是您可透過範本化篩選器和 Liquid 參數啟用的部分功能。
範本化篩選器和 Liquid 參數會使用 Liquid 範本語言,將使用者輸入內容插入 SQL 查詢。首先,您可以使用 LookML 參數建立供使用者互動的欄位。接著,您可以使用 Liquid 變數,將使用者輸入內容插入 SQL 查詢。
範例
讓我們看看幾個範例,瞭解範本篩選器和 Liquid 參數的價值。
使用範本化篩選器建立動態衍生資料表
假設您要計算東北地區顧客的生命週期支出,可以建立衍生資料表:
view: customer_facts {
derived_table: {
sql:
SELECT
customer_id, -- Can be made a dimension
SUM(sale_price) AS lifetime_spend -- Can be made a dimension
FROM
order
WHERE
region = 'northeast' -- Can NOT be made a dimension
GROUP BY 1
;;
}
}
您可以在這項查詢中,從 customer_id
和 lifetime_spend
建立維度。不過,假設您希望使用者能夠指定 region
,而不是將其硬式編碼為「northeast」。region
無法做為維度公開,因此使用者無法照常篩選。
其中一個選項是使用範本化篩選器,如下所示:
view: customer_facts {
derived_table: {
sql:
SELECT
customer_id,
SUM(sale_price) AS lifetime_spend
FROM
order
WHERE
{% condition order_region %} order.region {% endcondition %}
GROUP BY 1
;;
}
filter: order_region {
type: string
}
}
如需逐步操作說明,請參閱「基本用法」一節。
使用 Liquid 參數建立動態指標
請考慮使用經過篩選的指標,加總售出的褲子數量:
measure: pants_count {
filters: [category: "pants"]
}
這很簡單,但如果類別有數十個,為每個類別建立指標就會很麻煩。此外,這也可能導致使用者探索體驗混亂。
您也可以建立動態指標,如下所示:
measure: category_count {
type: sum
sql:
CASE
WHEN ${category} = '{% parameter category_to_count %}'
THEN 1
ELSE 0
END
;;
}
parameter: category_to_count {
type: string
}
如需逐步操作說明,請參閱「基本用法」一節。
基本用法
步驟一:建立可供使用者互動的內容
- 如果是範本篩選器,請新增
filter
。 - 如為 Liquid 參數,請新增
parameter
。
無論是哪一種情況,這些欄位都會顯示在欄位挑選器的「僅限篩選的欄位」部分。
filter
和 parameter
欄位皆可接受一系列子項參數,方便您自訂這些欄位的運作方式。如需完整清單,請參閱「欄位參數」說明文件頁面。parameter
欄位有兩個選項需要特別注意。
首先,parameter
欄位可採用名為「unquoted」 的特殊類型:
parameter: table_name {
type: unquoted
}
這類值可插入 SQL,不必像字串一樣加上引號。當您需要插入資料表名稱等 SQL 值時,這項功能就非常實用。
其次,parameter
欄位有一個名為「允許的值」的選項,可讓您將易記的名稱與要插入的值建立關聯。例如:
parameter: sale_price_metric_picker {
description: "Use with the Sale Price Metric measure"
type: unquoted
allowed_value: {
label: "Total Sale Price"
value: "SUM"
}
allowed_value: {
label: "Average Sale Price"
value: "AVG"
}
allowed_value: {
label: "Maximum Sale Price"
value: "MAX"
}
allowed_value: {
label: "Minimum Sale Price"
value: "MIN"
}
}
步驟二:套用使用者輸入內容
第二個步驟是使用 Liquid 視需要新增範本化篩選器或 Liquid 參數。
範本篩選器
範本化篩選器的語法如下:
{% condition filter_name %} sql_or_lookml_reference {% endcondition %}
condition
和endcondition
這兩個字詞永遠不會變更。- 將
filter_name
替換為您在第一個步驟中建立的篩選器名稱。如果沒有建立僅限篩選器的欄位,也可以使用維度。 - 將
sql_or_lookml_reference
替換為應「等於」使用者輸入內容的 SQL 或 LookML (本節稍後會詳細說明)。如果使用 LookML,請使用${view_name.field_name}
LookML 語法。
在上述範例「使用範本化篩選器製作動態衍生資料表」中,我們使用了:
{% condition order_region %} order.region {% endcondition %}
請務必瞭解 Liquid 標記與您在標記之間編寫的 SQL 互動。這些範本篩選器標記一律會轉換為邏輯運算式。舉例來說,如果使用者在 order_region
篩選器中輸入「Northeast」,Looker 會將這些標記轉換為下列項目:
order.region = 'Northeast'
換句話說,Looker 會解讀使用者輸入內容,並產生適當的邏輯運算式。
由於範本化篩選器會傳回邏輯運算式,因此您可以搭配其他邏輯運算子和邏輯運算式使用,這些運算子和運算式在 SQL WHERE
陳述式中有效。沿用先前的範例,如果想傳回使用者選取區域以外的所有值,可以在 WHERE
陳述式中使用下列內容:
NOT ({% condition order_region %} order.region {% endcondition %})
您也可以使用 LookML 欄位做為篩選條件。直接套用至 LookML 欄位的任何篩選器,都會決定 WHERE
陳述式的值:
view: customer_facts {
derived_table: {
sql:
SELECT
customer_id,
SUM(sale_price) AS lifetime_spend
FROM
order
WHERE
{% condition region %} order.region {% endcondition %}
GROUP BY 1
;;
}
dimension: region {
type: string
sql: ${TABLE}.region ;;
}
Liquid 參數
Liquid 參數的語法可細分為以下幾種:
{% parameter parameter_name %}
- 這個字詞
parameter
永遠不會變更。 - 將
parameter_name
替換為您在第一個步驟中建立的parameter
名稱。
舉例來說,如要套用parameter
欄位在步驟一中的輸入內容,您可以建立類似這樣的指標:
measure: sale_price_metric {
description: "Use with the Sale Price Metric Picker filter-only field"
type: number
label_from_parameter: sale_price_metric_picker
sql: {% parameter sale_price_metric_picker %}(${sale_price}) ;;
value_format_name: usd
}
選擇範本篩選器或 Liquid 參數
雖然範本篩選器和 Liquid 參數類似,但兩者之間還是有重要差異:
如果想提供更彈性的使用者輸入方式 (例如各種日期範圍或字串搜尋),請盡可能使用範本篩選器。Looker 可以解讀使用者輸入內容,並在幕後編寫適當的 SQL。這樣一來,您就不必考慮所有可能的使用者輸入類型。
如果無法插入邏輯陳述式,或您知道使用者可能會輸入的選項有限,請使用 Liquid 參數。