用量
derived_table:{
sql_trigger_value: SELECT CURDATE() ;;
...
}
}
层次结构
sql_trigger_value |
默认值
无接受
生成一行和一列的 SQL 语句
|
定义
请考虑使用
datagroup
和datagroup_trigger
(如缓存查询和使用 datagroups 重建 PDT 文档页面中所述)。
sql_trigger_value
可让您根据提供的 SQL 语句触发重新生成永久性派生表。如果 SQL 语句的结果与之前的值不同,系统会重新生成 PDT。
sql_trigger_value
参数仅考虑您编写的 SQL 中的第一行和第一列。因此,我们强烈建议您编写查询,以便只返回一个值(一行和一列)。这样可以消除对未来开发者的任何混淆,并防止非流式 SQL 方言将大型结果集加载到内存中。
默认情况下,只要另一个永久性派生表没有正在构建中,Looker 就会每五分钟运行一次您编写的 SQL 查询。如果 SQL 查询的结果发生变化,Looker 会重新生成派生的表。您可以使用 Looker 管理员设置中的 PDT 和 Datagroup 维护时间表设置根据需要更改此时间表。
例如,假设您运行 MySQL 并使用:
sql_trigger_value: SELECT CURDATE() ;;
结果将如下所示:
sql_trigger_value 运行时 | sql_trigger_value 结果 |
---|---|
2015 年 1 月 1 日 00:00 | 2015-01-01 |
2015 年 1 月 1 日 00:05 | 2015-01-01 |
2015 年 1 月 1 日 00:10 | 2015-01-01 |
… | … |
2015 年 1 月 1 日 23:55 | 2015-01-01 |
2015 年 1 月 2 日 00:00 | 2015-01-02 |
2015 年 1 月 2 日 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() |
每天特定时间 一次(世界协调时间) |
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() |
每天特定时间 一次(世界协调时间) |
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 中派生表文档页面的在开发模式下保留的表部分。