LookML如何实现维度省略时预聚合max值求和、时间聚合时取最大值?
方案结论
可以在LookML中动态实现该逻辑,无需预计算所有维度组合的预聚合表,核心通过Looker原生的分层聚合能力配合Liquid动态语法实现,完全匹配你需要的聚合规则。
具体实现步骤
- 第一步:配置完整的时间维度组,确保覆盖从最小粒度(小时)到所需的最大时间粒度(日、周等)
dimension_group: event_time { type: time timeframes: [raw, hour, date, week, month] sql: ${TABLE}.event_time ;; # 替换为你表中的时间字段名 }
- 第二步:编写两层聚合度量,先按最细维度(所有非时间维度+小时粒度)对预聚合的
max_thing求和,再按用户选中的维度和时间粒度取最大值
# 底层度量:对预聚合的max_thing做求和 measure: sum_max_thing_lowest_grain { type: sum sql: ${TABLE}.max_thing ;; } # 最终对外使用的度量:对底层求和结果按查询粒度取最大值 measure: expected_max_thing { type: max sql: ${sum_max_thing_lowest_grain} ;; # 强制指定底层聚合的最小分组键:所有非时间维度+最小时间粒度 aggregate_on: [event_time_hour, country, account_type] }
逻辑验证:当你只选中
account_type和小时粒度时间维度时,底层按country、account_type、event_time_hour分组求和,再按你选中的account_type + hour分组取最大值,得到小时级结果445、423;切换为日粒度时,上层按account_type + date分组,对同天内的所有小时求和结果取最大值,得到日度值445,完全符合预期。
注意事项
- 后续新增需要支持的拆分维度时,只需要同步更新
aggregate_on的参数列表即可,无需修改其他逻辑 - 源数据的最小时间粒度必须为小时,和
aggregate_on中配置的最低时间粒度保持一致 - 该逻辑为查询时动态计算,不会生成预计算表,仅对当前查询选中的维度做对应聚合,和普通度量的查询性能一致
内容的提问来源于stack exchange,提问作者grg-n-sox
相关产品推荐
相关产品推荐

