深入 MaxCompute - 第十一弹 -QUALIFY
简介: MaxCompute 支持 QUALIFY 语法过滤 Window 函数的结果,使得查询语句更简洁易理解。Window 函数和 QUALIFY 语法之间的关系可以类比聚合函数+GROUP BY 语法和 HAVING 语法。
MaxCompute(原 ODPS)是阿里云自主研发的具有业界领先水平的分布式大数据处理平台, 尤其在集团内部得到广泛应用,支撑了多个 BU 的核心业务。MaxCompute 除了持续优化性能外,也致力于提升 SQL 语言的用户体验和表达能力,提高广大 MaxCompute 开发者的生产力。
MaxCompute 基于 MaxCompute2.0 新一代的 SQL 引擎,显著提升了 SQL 语言编译过程的易用性与语言的表达能力。我们在此推出深入 MaxCompute 系列文章
第一弹 - 善用MaxCompute编译器的错误和警告
第二弹 - 新的基本数据类型与内建函数
第三弹 - 复杂类型
第四弹 - CTE,VALUES,SEMIJOIN
第五弹 - SELECT TRANSFORM
第六弹 - User Defined Type
第七弹 - Grouping Set, Cube and Rollup
第八弹 - 动态类型函数
第九弹 - 脚本模式与参数视图
第十弹 - IF ELSE分支语句
本文将介绍 MaxCompute 支持QUALIFY语法,QUALIFY 语法支持指定过滤条件过滤窗口(Window)函数的结果,类似于 HAVING 语法处理经过聚合函数和 GROUP BY 后的数据。
QUALIFY 功能简介
语法格式
QUALIFY 语法过滤 Window 函数的结果,Window 函数和 QUALIFY 语法之间的关系可以类比聚合函数+GROUP BY 语法和 HAVING 语法。
典型的查询语句的执行顺序如下:
FROM
WHERE
GROUP BY 和 Aggregation Function
HAVING
WINDOW
QUALIFY
DISTINCT
ORDER BY
LIMIT
通常在一个查询语句中 QUALIFY 语法的执行顺序在WINDOW函数之后,用于对窗函数处理后的数据进行筛选。
使用场景
需要对 Window 函数的结果进行过滤,没有 QUALIFY 语法前,一般是在 FROM 语句中使用 SubQuery,并通过 WHERE 条件来配合实现过滤。如下:
改写后的查询语句:
也可以不使用别名,直接对 Window 函数进行过滤。
QUALIFY 和 WHERE/HAVING 的使用方法相同,只是执行顺序不同,所以 QUALIFY 语法允许用户写一些复杂的条件,比如:
QUALIFY 执行于窗口函数生效后,下面一个较复杂的例子可以直观的感受 QUALIFY 语法的执行顺序:
示例
row_number窗口函数示例,将所有职工根据部门(deptno)分组(作为开窗列),每个组内根据薪水(sal)做降序排序,获得职工在自己组内的序号,若需要查询每个部门薪水 top 3 的信息,则实现如下
数据准备
在 FROM 语句中使用 SubQuery,并通过 WHERE 条件来配合实现过滤,如下:
通过 QUALIFY 实现如下:
结果均如下图,但是使用 QUALIFY 会使得查询语句更简洁易理解。
注意事项
QUALIFY 语法需要查询语句里面至少一个 Window 函数,在没有 Window 函数的情况下使用 QUALIFY 语法会报错:
FAILED: ODPS-0130071:[3,1] Semantic analysis exception - use QUALIFY clause without window function
。错误示例如下。
QUALIFY 语法中允许用户使用 SELECT 中列的别名作为过滤条件的一部分,示例如下。
版权声明: 本文为 InfoQ 作者【阿里云大数据AI技术】的原创文章。
原文链接:【http://xie.infoq.cn/article/e1fc071230ff65ad899dd2be9】。文章转载请联系作者。
评论