用法
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 使用模式:
_filters['view_name.field_name']{% date_start date_filter_name %}{% date_end date_filter_name %}{% condition filter_name %} sql_or_lookml_reference {% endcondition %}{% if %} sql_or_lookml_reference {% else %} other_value {% endif %}{% parameter parameter_name %}parameter_name._parameter_value_user_attributes['name_of_attribute']_localization['localization_key']_model._name_explore._name_explore._dashboard_url_query._query_timezoneview_name._in_queryview_name.field_name._in_queryview_name.field_name._is_selectedview_name.field_name._is_filtered_view._name
sql_preamble 不支持以下 Liquid 使用模式:
valuerendered_valuefilterable_valuelinklinked_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 语句计算中位数,并在每次运行探索中的查询之前将中位数函数插入到 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);;
...
}
此代码不会使用硬编码的名称(如 mytable)作为临时表,而是会将 Liquid 变量替换为本地化字符串文件中为键 storage_table_name 定义的实际字符串。如需了解详情,请参阅在 Liquid 变量中使用语言区域。
前导语后面的 Looker 查询随后会引用此动态命名的表。例如,SQL 查询会使用 FROM {{ _localization['storage_table_name'] }}。