传统方式(使用CTE):
WITH ranked_data AS (SELECT user_id,ip,country_code,os,RANK() OVER (PARTITION BY user_id ORDER BY log_datetime DESC) AS previous_loginsFROM login_logs
)
SELECT user_id, ip, country_code, os
FROM ranked_data
WHERE previous_logins = 1;
使用 QUALIFY 的方式:
SELECT user_id,ip, country_code,os,RANK() OVER (PARTITION BY user_id ORDER BY log_datetime DESC) AS previous_logins
FROM login_logs
QUALIFY previous_logins = 1;
可以看到,使用 QUALIFY
减少了代码行数,避免了额外的嵌套层级,查询意图更加直观。需要注意的是,QUALIFY
主要带来的是代码简洁性和可读性的提升,在性能上可能不会有显著改善。
支持版本: Spark 3.2.0 及以上
阿里云maxcompute sql也支持