先用再理解 一个模板解决sql窗口函数问题

简介

我来说说我这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

这就很具体了,比如

  1. 现有一个公司工资表Salary,我想找到每个部门收入最多的前两个员工。
  2. 考试成绩表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

简单记录一下,大家共勉~~

猜你喜欢

转载自blog.csdn.net/qq_40742298/article/details/105907188