一文搞定数分面试必考题之:窗口函数( 二 )


2、Following
Rows2following中文意思是之后的两行 , 跟preceding正好相反 , Preceding是向前 , following是向后 。

一文搞定数分面试必考题之:窗口函数
文章图片
3、preceding跟following相结合
代码及运行结果为:

一文搞定数分面试必考题之:窗口函数
文章图片

一文搞定数分面试必考题之:窗口函数
文章图片
从以上的运行结果可以看出是把每一行(当前行)的前一行和后一行作为汇总的依据 。
05-窗口函数应用真题解析
1、topN问题或者组内排序问题在实际的场景中 , 我们会经常会遇到排序或者排名问题 , 这个时候使用窗口函数会使问题变的简单 。 求出每个课程的学生成绩排名:
一文搞定数分面试必考题之:窗口函数
文章图片
2、连续登录问题假设有一张含两列(用户id、登陆日期)的表 , 查询每个用户连续登陆的天数、最早登录时间、最晚登录时间和登录次数 。 首先要对数据进行去重 , 防止同一个用户一天之内出现连续登录的情况;假如一个用户是连续登录的话 , 用login_time-窗口函数的排序后得到的日期应该是一样的 , 连续登录的用户前后之间的时间差就是一个差值为1的等差数列;第一步 , 先用row_number函数排序 , 然后用登录日期减去排名 , 得到辅助列日期 , 如果辅助列日期是相同的话 , 证明用户是连续登录 。 运行的代码及结果为:
一文搞定数分面试必考题之:窗口函数
文章图片

一文搞定数分面试必考题之:窗口函数
文章图片
第二步 , 用user_id和辅助列作为分组依据 , 分到一组的就是连续登录的用户 。 在每一组中最小的日期就是最早的登陆日期 , 最大的日期就是最近的登陆日期 , 对每个组内的用户进行计数就是用户连续登录的天数 。 运行代码及结果为:
一文搞定数分面试必考题之:窗口函数
文章图片

一文搞定数分面试必考题之:窗口函数
文章图片
若求解每个用户的最大登录天数 。 其实可以在以上的查询结果为基础 , 利用聚合函数就可以求出最大的登录天数问题 。 假如求解连续登录5天的用户 , 除了可以使用上述的方法 , 还可以使用lead函数进行窗口偏移来进行求解 。 示例:数据还是上题中的数据 , 求解连续登录五天的用户第一步 , 用lead函数进行窗口偏移 , 查找每个用户5天后的登陆日期是多少 , 如果是空值 , 说明他没有登录 。 运行的代码为
一文搞定数分面试必考题之:窗口函数
文章图片
在lead函数里 , 为何偏移行数的参数设置为4而不是5呢 , 这是因为求解的是连续登录5天的用户 , 包括当前行在内一共是5行 , 所以应该向下偏移4行 。 运行的结果如下:
一文搞定数分面试必考题之:窗口函数
文章图片
第二步 , 用datediff函数计算(日期-第五次登陆日期)+1是否等于5 , 等于5证明用户是连续5天登录的 , 为空值或者大于5都不是5天连续登陆的用户 。 第三步 , 用where设定条件 , 差值=5筛选连续登录的用户 。 二、三步运行的代码为:
一文搞定数分面试必考题之:窗口函数
文章图片
用lead函数求解连续登录的问题还有一个好处就是当表中的数据不在同一个月份时也可以完美的解决 , 不用再考虑月份带来的影响 。