dense_rank() 和 rank()
题目
请你统计最大连续回答问题的天数大于等于3天的用户及其等级?
用到的表
表 author_tb表 answer_tb
创建表并初始化表中数据
思路
难点:“最大连续回答问题的天数”该如何实现?
初次看到这个问题,确实非常不好实现,这里,我们先对 表 根据日期对作者author_id进行分组,因为每天每个作者可能会回答多个问题。代码和结果如下:
看到分组的结果后,我们突发奇想,可以把分组的结果作为临时表再次进行操作,如何操作哪?根据 进行 ,然后使用 窗口函数
代码如下:
通过查询得到的这个结果,我们基本上就实现了“连续日期”的这个问题。以上查询了2次,我们可以把分组和窗口函数合并成成只需要查询一次,代码如下:
2次执行的结果是一模一样的,由此我们也能够看出来,先执行的是分组函数,窗口函数是最后执行的。
得到这个临时表后,日期虽然进行了排名,但是对于不连续的日期也进行了排序,所以这里我们要使用如下的逻辑进行判断是否为连续日期:如果是连续日期,日期-排名 是相等的;
通过 筛选 日期-排名 的值是否相等,我们既可以筛选出连续日期,需要用到一个函数,实现的代码如下:
注意排序的条件:, 如果是连续日期情况,通过 "日期-对应排序"得到的结果进行count,即可得到对应的连续日期的天数。最后,我们对目前到的的临时表进行筛选 day_cnt 的日期 >= 3 即可得到题目所要求的结果,代码如下:
总结
这道题目到这里也就结束了,本题属于困难题,主要的难度在于如何求作者连续回答的天数,我们使用所掌握的SQL查询知识点进行求解,把问题分成一步一步的进行求解:由于每天一个作者可以回答多个问题,我们根据日期和作者id进行分组,分组的结果对作者id进行PARTITION BY,得到每个作者不同日期的排名;然后,由于日期不连续也会排名,我们要知道如果是连续日期 日期-对应排名 是不变的;各级author_id和 日期-对应排名 进行分组聚合;筛选连续天数 >= 3 的作者;
到此,本题也就结束了,整体来说本题使用了分组查询和窗口函数已经一些常用的日期处理函数和窗口函数,附录中我会补充到,谢谢大家。
参考书
以上内容参考这本书籍,MySQL8.0及以上版本的功能基本上赶上商业数据库如Oracle的大多数功能。这本书从基本的数据库安装开始,依次循序渐进讲解,数据库的增删改查、基本的查询语句,子查询、连接、窗口函数等企业中常用的知识点,具有实战性强的特点,欢迎点击链接购买。
附录
dense_rank() 和 rank()
下面的查询显示了RANK()和DENSE_RANK()之间的差异,前者生成带间隙的列组,后者生成不带间隙的列组。
日期加减数字天数
DATE_SUB()DATE_ADD()
DATE_ADD() 同理可得。
【每日一记,防止忘记】
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/97807.html