窗口函数可以进行排序,生成序号等操作,结合查询语句,可以进行一些较为复杂的查询。本文主要介绍窗口函数的用法,以及相关的查询示例。

示例

现在有成绩表grade

calss name grade
高一一班 张三 79
高一一班 李四 86
高一一班 王武 87
高一二班 王六 90
高一二班 张望 76
高一二班 刘大 88
SELECT *,RANK() OVER (PARTITION BY class ORDER BY grade) AS ranking
FROM grade;

在SELECT 子句中,可对已有数据进行分组排序。在上例中,即按照班级(class)分组,再对每个班级的学生成绩(grade)进行排序。

查询结果中展示排名数字。

执行SQL语句后的结果:

calss name grade ranking
高一一班 王武 87 1
高一一班 李四 86 2
高一一班 张三 79 3
高一二班 王六 90 1
高一二班 刘大 88 2
高一二班 张望 76 3

语法解析

<窗口函数> OVER (PARTITON BY 分组列 ORDER BY 排序列)

之所以叫窗口函数,是因为通过PARTITION BY可将数据划分为不同的数据范围,这个数据范围即称为窗口。如上例中,将数据按照班级划分为不同的数据范围。(同GROUP BY的分组相似)

用于排序的窗口函数主要包括:

  • RANK

计算排序时,如果存在相同位次的记录,则会跳过之后的位次。

例:有三条记录并列排第一,则:1,1,1,4

  • DENSE_RANK

计算排序,存在相同位次的记录,不会跳过之后的位次。

例:有三条记录并列排第一,则1,1,1,2

  • ROW_NUMBER

连续排位

例:有三条记录并列排第一,则1,2,3,4

语句示例:

RANK() OVER (PARTITON BY class ORDER BY grade)

语句解析:

RANK() :函数后面的括号为习惯用法。里面不需要放置参数。上述其他窗口函数均使用括号。

PARTITON BY :设定排序的对象范围,上例中,按照不同的班级进行排名,因此PARTITON BY class。

ORDER BY:排序标准。上例中,按照每个班级中的成绩排名,因此ORDER BY grade。

此语法仅用在SELECT子句之后,为查询结果增添排序列。在SQL语句执行时,执行FROM中的数据表,再执行WHERE条件,最后才会在执行SELECT子句时,按照函数语句,对查询结果进行分组排序。

参考题目

链接:在gameList表中(player_id, event_d__牛客网
来源:牛客网

在gameList表中(player_id, event_date)是主键,如何显示每个玩家(player_id)首次登录的设备号(device_id),并同时显示玩家ID(player_id)?

player_id

device_id

event_date

games_played

111

21

2020-03-01

5

111

21

2020-01-02

6

212

33

2020-09-03

1

322

11

2020-01-21

0

322

44

2020-03-02

5

解题思路:

子查询排序:对每个玩家的信息,按照登陆日期进行排序。将子查询结果作为临时表。

对子查询的结果,保留每个玩家排名第一的数据。

SELECT player_id, device_id
FROM
(SELECT *,RANK() OVER (PARTITION BY player_id ORDER BY event_date) AS ranking FROM gamelist)
WHERE ranking=1;

在上述语句中,执行子查询产生的结果如下:

player_id

device_id

event_date

games_played

ranking

111

21

2020-03-01

5

2

111

21

2020-01-02

6

1

212

33

2020-09-03

1

1

322

11

2020-01-21

0

1

322

44

2020-03-02

5

子查询语句中,根据每个玩家的登陆日期进行排序。

再找出排名为1的数据,即每个玩家最早登陆的数据,据此找出对应的玩家(player_id)和设备号(device_id)。

SQL基础系列(八)——排序、分组排序(RANK)相关推荐

  1. SQL基础系列(二)——单表查询

    本文以单表查询为边界,介绍如何对一张表进行简单查询.限制条件查询.结果排序等内容.每种情况均有例句和补充说明. 如想看更多示例,请移步<SQL基础教程(第二版)>-MICK(如需电子版,可 ...

  2. SQL基础系列(一)——基本概念

    在几年前学习sql的时候,直接上手开始学习sql语句,但是忽略了sql(structured query language)的本质其实是关系型数据库的语言.在使用这些语言之前,必须对一些基本的概念有大 ...

  3. SQL 对结果集进行分组排序过滤重复数据 ROW_NUMBER

    简单的表操作: select row_number() over(partition by A.gid order by A.gid ) as RowN, A.* from Fit_Order A 关 ...

  4. SQL基础系列(四)——多表查询

    本部分内容包括如何使用2张以上的表如何进行横向联结(表的联结)及竖向联结(集合运算). 目录 1.表的联结 1.1联结是什么 1.2内联结 1.3外联结 1.4多张表联结 1.5复杂表联结语句 2.其 ...

  5. - 动规讲解基础讲解八——正整数分组

    将一堆正整数分为2组,要求2组的和相差最小. 例如:1 2 3 4 5,将1 2 4分为1组,3 5分为1组,两组和相差1,是所有方案中相差最少的. 整数个数n<=100,所有整数的和<= ...

  6. python入门基础系列八_03python—9个基础常识-python小白入门系列

    <python小白入门系列教程> 专栏 • 第03篇 文 | xc_718 深度好文:1828字 | 4分钟阅读 ​ 1. 注释 1)单行注释:##注释内容 print('123') #1 ...

  7. SQL基础系列(七)——CASE表达式

    在SQL语句中,CASE表达式是非常重要的函数,在区分不同情况时常使用. 本文介绍CASE表达式的基本语句,语句的基本执行逻辑及使用场景.在使用场景中将以实例展示CASE表达式的用法. 目录 1.基本 ...

  8. JMeter基础系列(八) JMeter断言之JSON断言

    若服务器返回的Response Body为JSON格式的数据,使用JSON断言来判断测试结果是较好的选择. 首先需要根据JSON Path从返回的JSON数据中提取需要判断的实际结果,再设置预期结果, ...

  9. SQL基础【八、Insert】

    User表 插入一行数据 user_id为2 user_name为tom,user_age为12 注意:如果每一项都有插入的话就不需要在前面列出列名!! Insert into user values ...

  10. python入门基础系列八_Python 入门系列 —— 21. dict 的介绍

    Dictionary 字典常用于存储键值对的集合,它是一种无序,可修改并且不允许重复,字典是用 {} 来表示,并带有 k/v 键值对,比如下面定义的字典结构.thisdict = { "br ...

最新文章

  1. NoBrokersAvailableError
  2. python连接mysql_Python连接MySQL
  3. Subst DOS命令
  4. vue 多页面多模块分模块打包 分插件安装_Vue渲染方式
  5. 南通大学python期末考试试卷答案_南通大学2015-2016年1学期《软工》作业点评总结...
  6. 为什么Java开发人员都带眼镜 | 程序员搞笑段子合集
  7. MySQL日志审计 帮你揪出内个干坏事儿的小子
  8. Java 设计模式之Mediator调节者模式
  9. linux 拷机软件,拷机软件跑起来,OS X平台下OpenGL初体验
  10. 炒股的最终下场(搞笑趣图)
  11. python 3教程_Python 3 教程
  12. layui实际项目使用过程中遇到的兼容性问题
  13. C++(类与对象)是纸老虎吗?
  14. 一个DataFrame赋值的诡异报错 A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc
  15. 渡阡科技Edu——梦开始的地方
  16. HBase--JavaAPI的操作,创建表修改表,增删改查数据
  17. Altium Designer 21 原理图库元件模型的组成介绍以及简单的电阻电容元件模型的创建
  18. Rocket简介(1)
  19. 每天读一点好玩心理学--酒吧
  20. vue2安装axios基本配置

热门文章

  1. 《游戏系统设计四》游戏资源系统太复杂? 啥?你不会?一步一步带你分析并实现,源码直接拿走
  2. 用计算机能算重量加权平均长度吗,利用计算器求平均数检测试题与*
  3. “白帽子”是怎么炼成的——从菜鸟走过来的心路历程
  4. Windows 技术篇 - win10开机启动项设置方法,windows启动项里没有的程序设置开机启动方法
  5. 最新互联网架构师视频教程+源码20G
  6. Mac上挂载移动硬盘出现“Read-only file system“问题
  7. 万用表二极管档位点亮发光二极管LED
  8. 推荐一个在线的icon图片合成工具(CSS Sprite)
  9. 梦幻岛颠覆式变革NFT,探索实体与数字的双轨价值
  10. oracle rac查看节点及宕库