窗口函数,也叫OLAP(Online AnallyticalProcessing,联机分析处理) ,可 以对数据库数据进行实时分析处理。
下面给大家准备了两道经典的窗口函数题目。并准备了清晰的解题思路,具体可以看图片。
第一题:求连续天数
下面表格是用户访问表users,记录了用户id (usr_ id)和访问日期(log_ date),求出连续3天下面表格是用户访问表users,记录了用户id以上访问的用户id。
解题思路:
我们需要根据这么一个简单的表,求出连续3天以上访问的用户。可以按照用户id给访问日期排名,然后再用访问日期减去排名,得到一个时间。如果用户是连续访问的,这个时间就是一样的。一个用户的这个时间如果出现3次及以上,说明这个用户连续访问了3天。
第一步:
先按照用户id (usr_ id) 对访问日期(log date)进行排名,这里要用到DENSE_ RANK() 这个窗口函数,用于给出排名序号。这个函数经常应用在给学生成绩进行排名。
查看结果,多了一个rank_ id的列
第二步:
得到排名后,我们用访问日期减去排名,得到一个时间flg date。
第三步:
同一个用户有3个及以上flg date相同,说明用户连续访问了3天,所以我们对上面查出的这个结果进行分组,并统计判断是否大于3
第四步:
这样就已经得出最终结果了,因为题目只想知道usr_ id,我们最后再将usr_ id展示出来就可以了。
最终结果:
第二题:找出工资前3高的员工(相同工资并列排名)
现在有Employee员工信息表和Department部门信息表,分别如下:
Employee员工信息表包括,每个员工对应的工号ld,姓名Name,工资Salary和部门编号Departmentld。
Department部门]信息表包含部门]对应的编号ID和部门名称Name。
编写一个SQL查询,找出每个部门获得前三高工资的所有员工
例如,根据上述给定的表,查询结果应返回:
解题思路:
这里要注意是细节是,最终结果输出的是前三高工资的所有员工,有些员工的工资是一样的,每个部门可能不止3名员工符合这个要求。
我们可以按照部门id (department_ id)给员工工资(salary) 排名,然后找出每个部门门前三高工资对应的所有员工。
最终具体代码如下:
专用窗口函数有: rank、 dense_ rank、row_ number
基本语法: < 窗口函数> over (partition by < 用于分组的列名 > order by < 用于排序的列名>)
over关键字用来指定函数执行的窗口范围,若后面括号中什么都不写,则意味着窗口包含满足WHERe条件的所有行,窗口函数基于所有行进行计算;
如果不为空,则支持以下4种语法来设置窗口。
- partition by子句:窗口按照哪些字段进行分组,窗口函数在不同的分组上分别执行
- order by子句:按照哪些字段进行排序,窗口函数将按照排序后的记录顺序进行编号
- frame子句: frame 是当前分区的一个子集,子句用来定义子集的规则,通常用来作为滑动窗口使用
- window_ name:给窗口指定-一个别名。如果SQL中涉及的窗口较多,采用别名可以看起来更清晰易读。
如果本文对你有帮助,别忘记给我个3连 ,点赞,转发,评论,咱们下期见。



