sql_preamble

用量

explore: explore_name {
  sql_preamble: SQL STATEMENT  ;;
}
階層
sql_preamble
預設值
接受
SQL 運算式

定義

sql_preamble 參數會指定在執行「探索」中的查詢之前執行的 SQL 陳述式。sql_preamble 的主要用途是在 Google BigQuery 上建立使用者定義函式 (UDF)。大多數資料庫方言都允許您直接在資料庫伺服器上安裝 UDF,但 Google BigQuery 是無狀態的,因此 sql_preamble 提供這項功能。

sql_preamble 中使用 Liquid

sql_preamble 參數支援 Liquid 和使用者屬性,可動態產生 SQL,適用於設定工作階段變數、選取不同倉儲或資料庫、在 BigQuery 中實作分割區修剪,以及更直接地與基礎資料庫互動,進而彈性篩選資料等用途。

sql_preamble 參數支援下列 Liquid 使用模式:

sql_preamble不支援下列 Liquid 用法:

  • value
  • rendered_value
  • filterable_value
  • link
  • linked_value
  • _field._name

範例

使用 sql_preamble 指定 BigQuery 預留項目

sql_preamble 參數中使用 BigQuery SET @@reservation SQL 陳述式,指定要用於探索查詢的 Google BigQuery 預留位置

explore: orders {
  sql_preamble:
    SET @@reservation='projects/your-project/locations/your-location/reservations/your-reservation';
}

使用 sql_preamble 新增臨時中位數

在 Google BigQuery 上建立使用者定義函式 (UDF),使用 Google BigQuery CREATE TEMP FUNCTION 陳述式計算中位數,並在執行 Explore 中的每個查詢前,將中位數函式插入 Google BigQuery SQL。

explore: salary {
  sql_preamble:
    CREATE TEMP FUNCTION MEDIAN(a_num ARRAY<FLOAT64>)
    RETURNS FLOAT64 AS ((
       SELECT
          AVG(num)
        FROM (
          SELECT
            row_number() OVER (ORDER BY num) -1 as rn
            , num
          FROM UNNEST(a_num) num
        )
        WHERE
          rn = TRUNC(ARRAY_LENGTH(a_num)/2)
            OR (
             MOD(ARRAY_LENGTH(a_num), 2) = 0 AND
              rn = TRUNC(ARRAY_LENGTH(a_num)/2)-1 )
    ));
  ;;
}

sql_preamble 中使用 Liquid 將資料表名稱本地化

sql_preamble 中使用 Liquid 建立臨時資料表,並根據使用者選取的語言命名,這樣單一 LookML 模型就能配合不同的內部命名慣例:

explore: orders {
  sql_preamble: 
    WITH {{ _localization['storage_table_name'] }} AS (select * from users);;
  ...
}

這個程式碼會將 Liquid 變數替換為 語言代碼字串檔案中為鍵 storage_table_name 定義的實際字串,而不是使用 mytable 等經過硬式編碼的名稱做為臨時資料表。詳情請參閱「在 Liquid 變數中使用語言代碼」。

前言之後的 Looker 查詢會參照這個動態命名的資料表。舉例來說,SQL 查詢會使用 FROM {{ _localization['storage_table_name'] }}