範本篩選器和 Liquid 參數

本進階主題適用於已具備 SQL 和 LookML 知識的使用者。

Looker 會自動提供使用者建立篩選器的功能,讓他們根據維度和指標操控查詢。雖然這種方法適用於許多用途,但無法滿足所有分析需求。範本篩選器和 Liquid 參數可大幅擴充支援的可能用途。

從 SQL 的角度來看,維度和指標只能變更查詢中最外層的 WHEREHAVING 子句。不過,您可能會發現自己想讓使用者操控 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_idlifetime_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

無論是哪一種情況,這些欄位都會顯示在欄位挑選器的「僅限篩選的欄位」部分。

filterparameter 欄位皆可接受一系列子項參數,方便您自訂這些欄位的運作方式。如需完整清單,請參閱「欄位參數」說明文件頁面。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 %}
  • conditionendcondition 這兩個字詞永遠不會變更。
  • 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 參數類似,但兩者之間還是有重要差異:

  • Liquid 參數會直接插入使用者輸入內容 (或使用您透過允許值定義的值)。
  • 範本化篩選器會以邏輯陳述式插入值,詳情請參閱「範本化篩選器」一節。

如果想提供更彈性的使用者輸入方式 (例如各種日期範圍或字串搜尋),請盡可能使用範本篩選器。Looker 可以解讀使用者輸入內容,並在幕後編寫適當的 SQL。這樣一來,您就不必考慮所有可能的使用者輸入類型。

如果無法插入邏輯陳述式,或您知道使用者可能會輸入的選項有限,請使用 Liquid 參數。