简介
我来说说我这blog的题目吧,为什么起这个名字。
“先用再理解”:首先我认为sql这东西不是什么门槛很高的技能,当然你想写的好、运行比别人快是需要下不少功夫的。但是我们至少要先用起来,或者是从效率低的写法开始,慢慢的你会感受到更好的方法的。总之,先用就对了,实践起来。
“一个模板解决sql窗口函数问题”:都说了要先用起来,那么咱们就简单点,先学个模板,嘻嘻。走个捷径后面理解的会更快地。
然后我们就进入正题了。
窗口函数
窗口函数又叫OLAP函数(online analytical processing),意思是对数据库数据进行实时分析处理。
对于窗口函数我们一般都遵循如下写法:
<窗口函数> OVER (partition by <要分组的列名> Order by <要排序的列名>)
现在不是很懂没关系,往后看。
经典窗口函数
下面这三种函数都可以记为排序函数:
主要的不同点如下所示:
rank()
对于相同的数据虽然排序一样,但是会默认站位,依次顺延,存在111456这样的排序情况。
dense_rank()
相同的数据排序相同,但是只会占用一个序号位,存在11123456这样的排序情况。
row_number()
我简单的理解为计算行数,从1开始,即使数据相同但是排序仍然顺延。
图片引用https://zhuanlan.zhihu.com/p/95487133
经典问题
topN
这就很具体了,比如
- 现有一个公司工资表Salary,我想找到每个部门收入最多的前两个员工。
- 考试成绩表grades ,我希望找到每门学科的前十名。
等等等等,类似这样的问题我们就叫做TopN问题。相信大家也知道了什么是TopN问题了。
如何解决呢?
介绍一个模板:
select *
from (select *, row_number() over (partition by bumen order by salary ) as rank1
from salary) as tmp
where rank1 <= N
输出排名问题
当我们已经可以解决TopN问题的时候,这个问题就变得非常简单了。
无非就是:
select *, rank()/dense_rank()/row_number() over (partition by col1 order by col2 desc) as rankk
from table_dist
简单记录一下,大家共勉~~