深入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 [expression]
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条件来配合实现过滤。如下:
SELECT col1, col2
FROM
(
SELECT
t.a as col1,
sum(t.a) over (partition by t.b) as col2
FROM values (1, 2),(2,3),(2,2),(1,3),(4,2) t(a, b)
)
WHERE col2 > 4;
改写后的查询语句:
SELECT
t.a as col1,
sum(t.a) over (partition by t.b) as col2
FROM values (1, 2),(2,3),(2,2),(1,3),(4,2) t(a, b)
QUALIFY col2 > 4;
也可以不使用别名,直接对Window函数进行过滤。
SELECT t.a as col1,
sum(t.a) over (partition by t.b) as col2
FROM values (1, 2),(2,3),(2,2),(1,3),(4,2) t(a, b)
QUALIFY sum(t.a) over (partition by t.b) > 4;
QUALIFY和WHERE/HAVING的使用方法相同,只是执行顺序不同,所以QUALIFY语法允许用户写一些复杂的条件,比如:
SELECT *
FROM values (1, 2) t(a, b)
QUALIFY sum(t.a) over (partition by t.b) IN (SELECT a FROM t1)
QUALIFY执行于窗口函数生效后,下面一个较复杂的例子可以直观的感受QUALIFY语法的执行顺序:
SELECT a, b, max(c)
FROM values (1, 2, 3),(1, 2, 4),(1, 3, 5),(2, 3, 6),(2, 4, 7),(3, 4, 8) t(a, b, c)
WHERE a < 3
GROUP BY a, b
HAVING max(c) > 5
QUALIFY sum(b) over (partition by a) > 3;
--+------------+------------+------------+
--| a | b | _c2 |
--+------------+------------+------------+
--| 2 | 3 | 6 |
--| 2 | 4 | 7 |
--+------------+------------+------------+
示例
row_number窗口函数示例,将所有职工根据部门(deptno)分组(作为开窗列),每个组内根据薪水(sal)做降序排序,获得职工在自己组内的序号,若需要查询每个部门薪水top 3的信息,则实现如下
-
数据准备
create table if not exists emp(empno string,ename string,job string,mgr string,hiredate string,sal string,comm string,deptno string);insert into table emp values ('7369','SMITH','CLERK','7902','1980-12-17 00:00:00','800','','20') ,('7499','ALLEN','SALESMAN','7698','1981-02-20 00:00:00','1600','300','30') ,('7521','WARD','SALESMAN','7698','1981-02-22 00:00:00','1250','500','30') ,('7566','JONES','MANAGER','7839','1981-04-02 00:00:00','2975','','20') ,('7654','MARTIN','SALESMAN','7698','1981-09-28 00:00:00','1250','1400','30') ,('7698','BLAKE','MANAGER','7839','1981-05-01 00:00:00','2850','','30') ,('7782','CLARK','MANAGER','7839','1981-06-09 00:00:00','2450','','10') ,('7788','SCOTT','ANALYST','7566','1987-04-19 00:00:00','3000','','20') ,('7839','KING','PRESIDENT','','1981-11-17 00:00:00','5000','','10') ,('7844','TURNER','SALESMAN','7698','1981-09-08 00:00:00','1500','0','30') ,('7876','ADAMS','CLERK','7788','1987-05-23 00:00:00','1100','','20') ,('7900','JAMES','CLERK','7698','1981-12-03 00:00:00','950','','30') ,('7902','FORD','ANALYST','7566','1981-12-03 00:00:00','3000','','20') ,('7934','MILLER','CLERK','7782','1982-01-23 00:00:00','1300','','10') ,('7948','JACCKA','CLERK','7782','1981-04-12 00:00:00','5000','','10') ,('7956','WELAN','CLERK','7649','1982-07-20 00:00:00','2450','','10') ,('7956','TEBAGE','CLERK','7748','1982-12-30 00:00:00','1300','','10') ; -
在FROM语句中使用SubQuery,并通过WHERE条件来配合实现过滤,如下:
SELECT a.* FROM (SELECT deptno,ename,sal,ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY sal DESC ) AS numsFROM emp) a WHERE a.nums<=3 ; -
通过QUALIFY实现如下:
SELECT deptno,ename,sal,ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY sal DESC ) AS nums FROM emp QUALIFY nums <= 3 ;
结果均如下图,但是使用QUALIFY会使得查询语句更简洁易理解。

注意事项
-
QUALIFY语法需要查询语句里面至少一个Window函数,在没有Window函数的情况下使用QUALIFY语法会报错:
FAILED: ODPS-0130071:[3,1] Semantic analysis exception - use QUALIFY clause without window function。错误示例如下。SELECT * FROM values (1, 2) t(a, b) QUALIFY a > 1; -
QUALIFY语法中允许用户使用SELECT中列的别名作为过滤条件的一部分,示例如下。
SELECT sum(t.a) over (partition by t.b) as c1 FROM values (1, 2) t(a, b) QUALIFY c1 > 1;
相关文章:
深入MaxCompute -第十一弹 -QUALIFY
简介: MaxCompute支持QUALIFY语法过滤Window函数的结果,使得查询语句更简洁易理解。Window函数和QUALIFY语法之间的关系可以类比聚合函数GROUP BY语法和HAVING语法。 MaxCompute(原ODPS)是阿里云自主研发的具有业界领先水平的分…...
Mysql定时备份事件
创建了一个名为backup_database的定时任务,每天自动在当前时间的后一天开始执行。备份数据库的代码使用mysqldump命令将数据库导出为sql文件保存在指定的备份目录中。 需要注意的是,上述代码中的用户名 (username)、密码 (password)、主机名 (hostname) …...
探索ClickHouse——安装和测试
我们在Ubuntu 20 Server版虚拟机上对ClickHouse进行探索。 安装 检测环境 grep -q sse4_2 /proc/cpuinfo && echo "SSE 4.2 supported" || echo "SSE 4.2 not supported"SSE 4.2 supported 可以看到我们的环境支持编译版本的。如果不支持的环境…...
常用的css样式
1:flex布局 .flex-between {display: flex;justify-content: space-between; }.flex-evenly {display: flex;justify-content: space-evenly; }.flex-end {display: flex;justify-content: flex-end; }.flex {display: flex; }.flex-center {display: flex;justify…...
小兔鲜儿 - 微信登录
目录 微信登录 登录方式 静态结构 获取登录凭证 获取手机号码 微信登录接口(生产环境) 模拟手机登录(开发环境) 用户信息持久化存储 涉及知识点:微信授权登录,文件上传,Store 状态管理等。 微信登录 微信小程序的开放…...
C++ Primer阅读笔记--对象移动(右值引用、移动迭代器和引用限定符的使用)
目录 1--右值引用 2--std::move 3--移动构造函数 4--移动赋值运算符 5--移动迭代器 6--引用限定符 1--右值引用 右值引用必须绑定到右值的引用,通过 && 获得右值引用; 右值引用只能绑定到临时对象(即将被销毁的对象)…...
【办公类-16-01-02】2023年度上学期“机动班下午代班的排班表——跳过周三、节日和周末”(python 排班表系列)
背景需求: 2023年第一学期(2023年9-2024年1月),我又被安排为“机动班”,根据新学期的校历,手动推算本学期的机动班的带班表 排版原则 1、班级数量:共有6个班级,循环滚动 2、每周次…...
ChatGPT HTML JS Echarts实现热力图展示
热力图是一种常用的数据可视化图表,主要用于展示数据的分布和密度情况。它通过使用不同颜色的热点来表示数据在地理或二维空间上的分布情况,从而直观地显示出数据的密集程度和趋势。 热力图的功能和作用如下: 1. 数据分布展示:热力图可以将大量数据以热点的形式展示在地理…...
JavaScript七小知
文章目录 1. == 和 ===区别2. a++ 和 ++a区别3. 创建js对象的三种方式4. 原型与原型链相关4.1 prototype4.2 __proto__4.3 constructor4.4 原型链5. 定时器的两种设置方式6. 时间相关7. axios与axios拦截器1. == 和 ===区别 == 只是判断值是否一致, === 会判断数据类型和…...
Ubuntu【系统环境下】【编译安装OpenCV】【C++调用系统opencv库】
Ubuntu【系统环境下】【编译安装OpenCV】【C调用系统opencv库】 前言: 本人需要用C写代码,调用OpenCV库,且要求OpenCV版本号大于4.1.0 由于使用的是18.04的版本,所以apt安装OpenCV的版本始终是3.2.0,非常拉胯&#…...
AR界安卓在中国,Rokid引爆空间计算狂潮
击关注 文丨刘雨琦 你可能很难想象,在一个没有显示屏也没有鼠标的空间,仅凭一副AR眼镜和一台口袋主机,就能完成一篇5000字的文章。 没错,8月26日,在2023 Rokid Jungle 新品发布会现场,这样的场景正在真实…...
在 React 中如何使用定时器
在React中使用定时器通常有两种方式:使用setInterval和setTimeout函数。 使用setInterval函数: 首先,在组件中导入useEffect和useState函数: import React, { useEffect, useState } from "react";在组件中声明一个状…...
Unity记录4.6-存储-第四阶段总结
文章首发见博客:https://mwhls.top/4822.html。 无图/格式错误/后续更新请见首发页。 更多更新请到mwhls.top查看 欢迎留言提问或批评建议,私信不回。 汇总:Unity 记录 摘要:存储初步实现的总结 总结-2023/08/19 实现了tile存储&…...
【Python】从入门到上头— 使用包、模块、安装第三方模块(7)
一.什么是模块 在Python中,一个.py文件就称之为一个模块(Module)。 模块好处?: 方便重用代码,写完一个通用的模块,可以在很多地方直接拿来用相同名字的函数和变量完全可以分别存在不同的模块中…...
flutter和原生利用pigeon建立通道
首先导入依赖: dependencies: pigeon: ^10.0.0定义一个文件: /// 用于定于flutter和平台的桥接方法 /// HostApi() 标记的,是用于 Flutter 调用原生的方法; /// FlutterApi() 标记的,是用于原生调用 Flutter 的方法&…...
TCP连接分析:探寻TCP的三次握手
文章目录 一、实验背景与目的二、实验需求三、实验解法1. 预先抓包监测使用Wireshark工具2.进行TCP三次握手,访问www.baidu.com3.分析Wireshark捕获的TCP包 摘要: 本实验使用Wireshark工具,通过抓包监测和分析,深入研究了与百度服…...
gitHooks使用教程
1. 安装所需依赖 npm install eslint prettier husky lint-staged --save-dev 2.初始化 husky npx husky-init && npm install 这将创建一个 .husky/ 目录,并且在其中包含一个示例的 pre-commit 文件。 3.设置 pre-commit 钩子 npx husky add .husky/…...
2023.8 - java - 数组
声明数组变量 首先必须声明数组变量,才能在程序中使用数组。下面是声明数组变量的语法: dataType[] arrayRefVar; // 首选的方法或dataType arrayRefVar[]; // 效果相同,但不是首选方法int[] a {1,2,3};int b[] new int[10];TS:let a:…...
ChatGPT怎么辅助解决社会问题?
ChatGPT作为一个强大的自然语言处理模型,具有潜力辅助解决多种社会问题。其能力可以应用于信息传递、教育、宣传、意识提高等领域,为社会问题的解决提供支持。以下将详细探讨ChatGPT如何辅助解决社会问题。 **1. 教育与意识提高**: ChatGPT可…...
Rust之自动化测试(一):如何编写测试
开发环境 Windows 10Rust 1.71.1 VS Code 1.81.1 项目工程 这里继续沿用上次工程rust-demo 编写自动化测试 Edsger W. Dijkstra在他1972年的文章《谦逊的程序员》中说,“程序测试可以是一种非常有效的方法来显示错误的存在,但它对于显示它们的不存在…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
