函数只读(窗口函数1)

窗口函数是那些对分区或窗口的每一行进行操作的函数。这些函数为每条查询行产生结果,而聚合函数则将它们分组,并将结果归入单行。

窗口函数的基本语法:

<窗口函数> OVER ( [ partition BY <列清单> ] ORDER BY <排序用列清单> )

  • 排名窗口函数:RANK、DENSE_RANK、ROW_number
  • 能够作为窗口函数的聚合函数:SUM、AVG、COUNT、MAX、MIN
  • 非聚类窗口函数(可用于同比、环比等):LAG、LEAD

PARTITION BY 按指定对象来分类。

ORDER BY 能够指定按照哪一列、何种顺序进行排序。

这篇主要是排名窗口函数的应用。

函数只读(窗口函数1)(1)

小智和他的小伙伴们

故事:来自真新镇的10岁天才少年小智,用他25年的学习经验夺得了世界冠军。今天他想在隔壁老木那里看看哪只杰尼龟和小火龙的攻击力最高。他简单的看了下数据,决定用SQL操作一番。

函数只读(窗口函数1)(2)

  • 首先看下数据:

SELECT * FROM pokemon_table;

函数只读(窗口函数1)(3)

  • 排名窗口函数的应用:

函数只读(窗口函数1)(4)

函数只读(窗口函数1)(5)

对上述SQL进行拆分解释,先来看看OVER括号里的内容:

  1. PARTITION BY对pokemon列进行了分组,将小火龙和杰尼龟分为两大组;
  2. 在分完组后,ORDER BY对attack列按降序排列,然后分别赋予排名。

函数只读(窗口函数1)(6)

接下来看看这几个排名的区别:

  1. RANK 函数:计算排序时,如果存在相同位次的记录,则会跳过之后的位次。例如:有 3 条记录排在第 1 位时:1 位、1 位、1 位、4 位
  2. DENSE_RANK 函数:同样是计算排序,即使存在相同位次的记录,也不会跳过之后的位次。例如:有 3 条记录排在第 1 位时:1 位、1 位、1 位、2 位......
  3. ROW_NUMBER 函数:赋予唯一的连续位次。例如:有 3 条记录排在第 1 位时:1 位、2 位、3 位、4 位......

函数只读(窗口函数1)(7)

rank

函数只读(窗口函数1)(8)

dense_rank

函数只读(窗口函数1)(9)

row_number

这三个排序还是比较好记的:

  • rank:正常排名,会跳位次
  • dense_rank:dense单词是密集的意思,所以排名是紧靠的,不存在跳位次
  • row_number:可以这么记,row是行的意思,每一个人必须单独占有一行,所以是1,2,3,4......

另外需要知道的是,排序窗口函数的第一个括号是不需要填任何东西的,而第二个括号中PARTITION BY不是必须项,但是去掉的话,就是按整个表的数据进行处理,不会按组进行分类处理了

函数只读(窗口函数1)(10)

函数只读(窗口函数1)(11)

我们按的是攻击力降序排列,没有了partition by,所以是对整个数据进行排序

总结:

<窗口函数> OVER ( [ PARTITION BY <列清单> ] ORDER BY <排序用列清单> )

  1. <窗口函数>填入RANK()、DENSE_RANK()、ROW_NUMBER(),括号不需要填写任何东西
  2. PARTITION BY <列清单>:列清单填入所需要的列(可以多个列),窗口函数会按填入的列进行分组,PARTITION BY不是必须项,去掉就是对整个数据进行处理
  3. ORDER BY <排序用列清单>:选定需要按哪一列的数据大小排序
  4. RANK():跳位次、DENSE_RANK():密集排序、ROW_NUMBER():1,2,3...

彩蛋:小智肯定不会只满足于攻击力高这一选项,毕竟是顶尖训练师,所以他接下来要做的事情便是找到综合实力最高的,平均实力最强的,数量最多的小精灵。

函数只读(窗口函数1)(12)

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页