SQL窗口函数
窗口函数表达式:
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行的值
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)