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 就会每 5 分钟运行一次您编写的 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 替换为您希望进行重新生成的具体时段
每天在特定时段展示 3 次
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 替换为您希望进行重新生成的具体时段
每天在特定时段展示 3 次
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 小时(世界协调时间 [UTC])
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 替换为您希望进行重新生成的具体时段
每天在特定时段展示 3 次
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 替换为您希望进行重新生成的具体时段
每天在特定时段展示 3 次
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 替换为您希望进行重新生成的具体时段
每天在特定时段展示 3 次
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 小时(世界协调时间 [UTC])
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 中的派生表文档页面中的开发模式下的持久化表部分。