sql_trigger_value

用量

view: my_view {
  derived_table: {
    sql_trigger_value: SELECT CURDATE() ;;
    ...
  }
}
階層
sql_trigger_value
預設值

接受
產生一列和一欄的 SQL 陳述式

定義

建議改用 datagroupdatagroup_trigger,詳情請參閱「快取查詢」說明文件頁面。

sql_trigger_value 可根據您提供的 SQL 陳述式,觸發永久衍生資料表的重新生成作業。如果 SQL 陳述式的結果與先前的值不同,系統會重新產生 PDT。

sql_trigger_value 參數只會考量您編寫的 SQL 中的第一列和第一欄。因此,我們強烈建議您編寫查詢,只傳回一個值 (一個資料列和一個資料欄)。這樣可避免日後開發人員產生混淆,並防止非串流 SQL 方言將大型結果集載入記憶體。

根據預設,只要沒有其他永久衍生資料表正在建構中,Looker 就會每五分鐘執行您編寫的 SQL 查詢。如果 SQL 查詢的結果有變更,Looker 會重新產生衍生資料表。您可以在 Looker 的管理設定中,使用「PDT 和資料群組維護時間表」設定,視需要變更這項時間表。

舉例來說,假設您執行的是 MySQL,並使用:

    sql_trigger_value: SELECT CURDATE() ;;

結果如下:

sql_trigger_value 執行時間 sql_trigger_value 結果
2015-01-01 00:00 2015-01-01
2015-01-01 00:05 2015-01-01
2015-01-01 00:10 2015-01-01
... ...
2015-01-01 23:55 2015-01-01
2015-01-02 00:00 2015-01-02
2015-01-02 00:05 2015-01-02

您會發現這項 SQL 查詢的值每天午夜會變更一次,因此衍生資料表會在這些時間重新產生。

Looker 不會對 sql_trigger_value 執行時區轉換。如果您使用 sql_trigger_value 在午夜或一天中的特定時間觸發 PDT 重建,觸發條件會以資料庫設定的時區為準。

如果管理員授予您 develop 權限,您可以在衍生資料表的 sql_trigger_value 查詢變更前,強制重新產生該資料表。執行查詢後,從「探索動作」齒輪選單中選取「重建衍生資料表並執行」選項。

如要進一步瞭解「重建衍生資料表並執行」選項,請參閱「Looker 中的衍生資料表」說明文件頁面。

範例

在 MySQL 上建立 PDT,每天午夜重建一次:

view: clean_events {
  derived_table: {
    sql:
      SELECT *
      FROM events
      WHERE type NOT IN ('test', 'staff') ;;
    sql_trigger_value: SELECT CURDATE() ;;
  }
}

以下各節顯示不同方言的各種 PDT 重建策略所用的 SQL:

Google BigQuery

期望的再生時間表 要使用的 SQL
太平洋時間每天午夜
SELECT FORMAT_TIMESTAMP('%F', CURRENT_TIMESTAMP(), 'America/Los_Angeles')
每天在特定時間一次
SELECT FLOOR(((TIMESTAMP_DIFF(CURRENT_TIMESTAMP(),'1970-01-01 00:00:00',SECOND)) - 60*60*3)/(60*60*24))

將「3」替換為要重新產生資料的時段
每天在特定時段發送兩次
SELECT CASE
  WHEN EXTRACT(HOUR FROM CURRENT_TIMESTAMP) > 4 AND EXTRACT(HOUR FROM CURRENT_TIMESTAMP) < 18
    THEN 'between 4am and 6pm'
  ELSE 'between 6pm and 4am'
END

將 4 和 18 替換為要重新產生資料的時段
每天在特定時段放送三次
SELECT CASE
  WHEN EXTRACT(HOUR FROM CURRENT_TIMESTAMP) > 4 AND EXTRACT(HOUR FROM CURRENT_TIMESTAMP) < 9
    THEN 'between 4am and 9am'
  WHEN EXTRACT(HOUR FROM CURRENT_TIMESTAMP) > 9 AND EXTRACT(HOUR FROM CURRENT_TIMESTAMP) < 18
    THEN 'between 9am and 6pm'
  ELSE 'between 6pm and 4am'
END

將 4、9 和 18 替換為您希望重新產生資料的時數
每小時
SELECT EXTRACT(HOUR FROM CURRENT_TIMESTAMP())
每 2 小時
SELECT FLOOR((TIMESTAMP_DIFF(CURRENT_TIMESTAMP(),'1970-01-01 00:00:00',SECOND)) / (2*60*60))

您可以將「2」替換為每次重新生成之間的小時數
一律不更新資料
SELECT 1

MySQL

期望的再生時間表 要使用的 SQL
每天午夜一次
SELECT CURDATE()
每天一次,時間為世界標準時間 (UTC) 的特定小時
SELECT FLOOR((UNIX_TIMESTAMP(NOW()) - 60*60*3)/(60*60*24))

將「3」替換為要重新產生資料的時段
每天在特定時段發送兩次
SELECT CASE
  WHEN EXTRACT(HOUR FROM CURRENT_TIMESTAMP) > 4 AND EXTRACT(HOUR FROM CURRENT_TIMESTAMP) < 18
    THEN 'between 4am and 6pm'
  ELSE 'between 6pm and 4am'
END

將 4 和 18 替換為要重新產生資料的時段
每天在特定時段放送三次
SELECT CASE
  WHEN EXTRACT(HOUR FROM CURRENT_TIMESTAMP) > 4 AND EXTRACT(HOUR FROM CURRENT_TIMESTAMP) < 9
    THEN 'between 4am and 9am'
  WHEN EXTRACT(HOUR FROM CURRENT_TIMESTAMP) > 9 AND EXTRACT(HOUR FROM CURRENT_TIMESTAMP) < 18
    THEN 'between 9am and 6pm'
  ELSE 'between 6pm and 4am'
END

將 4、9 和 18 替換為您希望重新產生資料的時數
特定資料表更新時
SELECT COUNT(*) FROM table
每小時
SELECT HOUR(CURTIME())
每 2 小時 (世界標準時間)
SELECT FLOOR(UNIX_TIMESTAMP() / (2*60*60))

您可以將「2」替換為每次重新生成之間的小時數
一律不更新資料
SELECT 1

Amazon Redshift

期望的再生時間表 要使用的 SQL
每天午夜一次
SELECT CURRENT_DATE
每天在特定時間一次
SELECT FLOOR((EXTRACT(epoch from GETDATE()) - 60*60*3)/(60*60*24))

將「3」替換為要重新產生資料的時段
每天在特定時段發送兩次
SELECT CASE
  WHEN EXTRACT(HOUR FROM CURRENT_TIMESTAMP) > 4 AND EXTRACT(HOUR FROM CURRENT_TIMESTAMP) < 18
    THEN 'between 4am and 6pm'
  ELSE 'between 6pm and 4am'
END

將 4 和 18 替換為要重新產生資料的時段
每天在特定時段放送三次
SELECT CASE
  WHEN EXTRACT(HOUR FROM CURRENT_TIMESTAMP) > 4 AND EXTRACT(HOUR FROM CURRENT_TIMESTAMP) < 9
    THEN 'between 4am and 9am'
  WHEN EXTRACT(HOUR FROM CURRENT_TIMESTAMP) > 9 AND EXTRACT(HOUR FROM CURRENT_TIMESTAMP) < 18
    THEN 'between 9am and 6pm'
  ELSE 'between 6pm and 4am'
END

將 4、9 和 18 替換為您希望重新產生資料的時數
特定資料表更新時
SELECT COUNT(*) FROM table
每小時
SELECT DATE_PART('hour', GETDATE())
每 2 小時
SELECT FLOOR(EXTRACT(epoch from GETDATE()) / (2*60*60))

您可以將「2」替換為每次重新生成之間的小時數
一律不更新資料
SELECT 1

PostgreSQL

期望的再生時間表 要使用的 SQL
每天午夜一次
SELECT CURRENT_DATE
每天在特定時間一次
SELECT FLOOR((EXTRACT(epoch from NOW()) - 60*60*3)/(60*60*24))

將「3」替換為要重新產生資料的時段
每天在特定時段發送兩次
SELECT CASE
  WHEN EXTRACT(HOUR FROM CURRENT_TIMESTAMP) > 4 AND EXTRACT(HOUR FROM CURRENT_TIMESTAMP) < 18
    THEN 'between 4am and 6pm'
  ELSE 'between 6pm and 4am'
END

將 4 和 18 替換為要重新產生資料的時段
每天在特定時段放送三次
SELECT CASE
  WHEN EXTRACT(HOUR FROM CURRENT_TIMESTAMP) > 4 AND EXTRACT(HOUR FROM CURRENT_TIMESTAMP) < 9
    THEN 'between 4am and 9am'
  WHEN EXTRACT(HOUR FROM CURRENT_TIMESTAMP) > 9 AND EXTRACT(HOUR FROM CURRENT_TIMESTAMP) < 18
    THEN 'between 9am and 6pm'
  ELSE 'between 6pm and 4am'
END

將 4、9 和 18 替換為您希望重新產生資料的時數
特定資料表更新時
SELECT COUNT(*) FROM table
每小時
SELECT DATE_PART('hour', NOW())
每 2 小時
SELECT FLOOR(EXTRACT(epoch from NOW()) / (2*60*60))

您可以將「2」替換為每次重新生成之間的小時數
一律不更新資料
SELECT 1

Snowflake

期望的再生時間表 要使用的 SQL
每天午夜一次
SELECT CURRENT_DATE()
每天一次,時間為世界標準時間 (UTC) 的特定小時
SELECT FLOOR((DATE_PART('EPOCH_SECOND', CURRENT_TIMESTAMP) - 60*60*3)/(60*60*24))

將「3」替換為要重新產生資料的時段
每天在特定時段發送兩次
SELECT CASE
  WHEN EXTRACT(HOUR FROM CURRENT_TIMESTAMP) > 4 AND EXTRACT(HOUR FROM CURRENT_TIMESTAMP) < 18
    THEN 'between 4am and 6pm'
  ELSE 'between 6pm and 4am'
END

將 4 和 18 替換為要重新產生資料的時段
每天在特定時段放送三次
SELECT CASE
  WHEN EXTRACT(HOUR FROM CURRENT_TIMESTAMP) > 4 AND EXTRACT(HOUR FROM CURRENT_TIMESTAMP) < 9
    THEN 'between 4am and 9am'
  WHEN EXTRACT(HOUR FROM CURRENT_TIMESTAMP) > 9 AND EXTRACT(HOUR FROM CURRENT_TIMESTAMP) < 18
    THEN 'between 9am and 6pm'
  ELSE 'between 6pm and 4am'
END

將 4、9 和 18 替換為您希望重新產生資料的時數
特定資料表更新時
SELECT COUNT(*) FROM table
每小時
SELECT HOUR(CURRENT_TIME())
每 2 小時 (世界標準時間)
SELECT FLOOR(DATE_PART('EPOCH_SECOND', CURRENT_TIMESTAMP) / (2*60*60))

您可以將「2」替換為每次重新生成之間的小時數
一律不更新資料
SELECT 1

常見挑戰

sql_trigger_value 必須設定永久衍生資料表

除非您已在資料庫連線設定中為衍生資料表啟用持續性,否則使用 sql_trigger_value 會導致 LookML 驗證錯誤。大多數客戶在首次設定資料庫連線時,設定持續性衍生資料表。這項規則最常見的例外狀況,是客戶將 Looker 連線至 PostgreSQL 唯讀熱切換次要資料庫。

sql_trigger_value 在開發模式和正式版模式下的運作方式不同

sql_trigger_value 應可在正式版模式中正常運作。在開發模式中,無論您導入的設定為何,所有衍生資料表都會視為已使用 persist_for: 24 hours。詳情請參閱「Looker 中的衍生資料表」說明文件頁面的「開發模式中的持續性資料表」一節。