【发布时间】:2021-09-08 13:16:07
【问题描述】:
为了获取主键的补充信息,我想出了两种方法。
一种是使用GROUP BY 和aggregation function [1],另一种是使用PARTITION BY 和window/analytic function (~ row_number) [2]。
我怀疑GROUP BY 是由于聚合函数而导致性能较低的方式(可能不是真的,因为PARTITION BY 方式使用子查询),但是,我不确定哪种方式是附加补充的更好方式列。
- 就时间复杂度和性能而言,哪种方法更好?
- 另外,有没有更好的附加辅助列的方法?
示例案例:获取用户上次登录信息(如ip,country_code,...)
可能的解决方案 1:GROUP BY 带有聚合函数
#standardSQL
SELECT
user_id, -- primary key
ARRAY_AGG(
STRUCT(
ip, country_code, os, channel_type
)
ORDER BY login_timestamp DESC LIMIT 1
)[OFFSET(0)].*
FROM user_login_info_table
GROUP BY user_id
可能的解决方案 2:PARTITION BY 带有子查询
#standardSQL
WITH
login_log AS (
SELECT
user_id,
ip, country_code, os, channel_type,
ROW_NUMBER() OVER (
PARTITION BY user_id ORDER BY login_timestamp DESC
) AS rn
FROM user_login_info_table
)
SELECT user_id, ip, country_code, os, channel_type
FROM login_log
WHERE rn = 1
参考上面的例子是一个过于简化的例子,它忽略了其他聚合字段。
参考文献
【问题讨论】:
-
当
GROUP BY需要与需要聚合的其他字段 一起使用时,我最终使用solution 1,而当不需要其他聚合时使用solution 2。多亏了这个建议,我最终通过执行样本来选择具有经验结果的查询。
标签: google-bigquery