窗口函数表达式:

function(args) OVER([PATITION BY experssion] [ORDER BY expression [ASC|DESC]][frame])

PARTITION BY:表示根据什么字段分组

ORDER BY:表示根据什么字段排序,默认是升序即ASC

一、排序函数

row_number():形如1,2,3——序号不重复,序号连续

rank():形如1,2,2,4——序号可以重复,序号不连续

dense_rank():形如1,2,2,3——序号可以重复,序号连续

ntile(n):将分区内的数据尽量平均地分成n个桶,并返回每一行所在的同号

力扣178题代码——分数排名

按照score字段降序排列

SELECT score
       ,DENSE_RANK() OVER(ORDER BY score DESC) AS 'rank'
FROM Scores

注:rank为SQL当中的关键字,作为字段名称需要加引号。

力扣184题代码——部门工资最高的员工

SELECT Department
       ,Employee
       ,Salary
FROM(
    SELECT Department.name AS Department
        ,Employee.name AS Employee
        ,Employee.salary AS Salary 
        ,DENSE_RANK() OVER(PARTITION BY departmentId ORDER BY Employee.salary DESC) AS salary_rank
    FROM Employee
    LEFT JOIN Department ON Employee.departmentId = Department.id 
) t
WHERE salary_rank = 1

二、聚合函数实现滑动窗口计算

1、聚合函数之滑动时间窗口 (主要在[frame]中)

rows模式——按物理行来进行划分

range模式——按数值逻辑来进行划分

2、滑动行范围的常用表达

{RANGE|ROWS} frame_start:从指定行开始到当前行结束

{RANGE|ROWS} BETWEEN frame_start AND frame_end:同时指定开始和结束

UNBOUNDED PRECEDING:从开始行

expression PRECEDING   --only allowed in ROWS mode:expression是一个整数,即向前推几行

CURRENT ROW:当前行

expression FOLLOWING  --only allowed in ROWS mode:expression是一个整数,即向后推几行

UNBOUNDED FOLLOWING:到结束行

3、常用聚合函数

COUNT(col)——返回所有非空值的个数

COUNT(*)

COUNT(字段)  --空置不计入

AVG(col)——返回平均值

SUM(col)——返回总和

MAX(col)——返回最大值

MIN(col)——返回最小值

FIRST(col)——返回第一个记录的值

LAST(col)——返回最后一个记录的值

三、值窗口函数

前后函数:

lead(expression,n):返回当前行的后n行

lag(expression,n):返回当前行的前n行

其中expression为某列的字段名

first_value(expression):返回窗口框架内第一行的值

last_value(expression):返回窗口框架内最后一行的值

nth_vlaue(expression,n):返回窗口框架内第n行的值

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐