首页 > 数据库 >Sql中的窗口函数

Sql中的窗口函数

时间:2023-09-18 11:23:38浏览次数:47  
标签:窗口 函数 查询 Score Sql 排名 score

在开发过程中,经常会遇到对分数进行排名的需求,通常的写法大部分都是子查询,而窗口函数可以更加便利的进行分数排列.

窗口函数

窗口函数是一种在查询结果集的特定窗口或分组中计算结果的函数。它可以根据指定的排序规则和窗口范围进行计算,并返回每个行的结果。

窗口函数通常与OVER子句一起使用,该子句定义窗口的范围。窗口可以根据行的排序顺序、分组或指定的条件进行定义。

常见的窗口函数包括:

  1. RANK():计算行在排序结果中的排名。
  2. DENSE_RANK():计算行在排序结果中的稠密排名,即相同的值将得到相同的排名,没有间隔。
  3. ROW_NUMBER():为查询结果中的每一行分配一个唯一的数字。
  4. SUM()、AVG()、MIN()、MAX():计算窗口中指定列的总和、平均值、最小值、最大值。
  5. LEAD()、LAG():获取指定列在窗口中的后一行或前一行的值。
  6. FIRST_VALUE()、LAST_VALUE():获取窗口中指定列的第一个值或最后一个值。

窗口函数可以用于各种情况,例如计算排名、累计求和、计算移动平均等。它们提供了一种在查询结果中执行复杂计算的灵活且高效的方式。

窗口函数不同于普通的聚合函数,它们在计算结果时不会引起行的合并或分组。相反,它们为每一行计算结果,并将结果附加到查询结果中的每一行。这使得窗口函数可以提供更详细和精确的计算结果。

实例

表: Scores

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| score       | decimal |
+-------------+---------+
在 SQL 中,id 是该表的主键。
该表的每一行都包含了一场比赛的分数。Score 是一个有两位小数点的浮点值。
 

查询并对分数进行排序。排名按以下规则计算:

分数应按从高到低排列。
如果两个分数相等,那么两个分数的排名应该相同。
在排名相同的分数后,排名数应该是下一个连续的整数。换句话说,排名之间不应该有空缺的数字。
按 score 降序返回结果表。

一般解法

select s1.score,
(select count(distinct score) from Scores s2 where s1.score <= s2.score) as 'rank'
 from Scores s1
 order by score desc

窗口函数

select score,
dense_rank() over (order by score desc) as 'rank'
from Scores

延伸

获取排名第一的

如果你只想获取排名第一的结果,可以在窗口函数中使用条件来筛选出排名为1的行。具体来说,可以在窗口函数的OVER子句中添加一个WHERE子句来过滤排名为1的行。

以下是一个示例查询,它选择Scores表中排名第一的Score值:

```sql
SELECT Score
FROM (
  SELECT Score, DENSE_RANK() OVER (ORDER BY Score DESC) AS Rank
  FROM Scores
) AS RankedScores
WHERE Rank = 1;

在这个查询中,首先使用内部查询将Scores表中的Score列和对应的排名计算出来。然后,外部查询从内部查询的结果中选择排名为1的Score值。这样就只会返回排名第一的结果。

注意,这里使用的是DENSE_RANK()函数,它可以处理具有相同Score值的情况,并确保相同的Score值都被分配相同的排名。如果使用RANK()函数,可能会出现不连续的排名,因为它会跳过相同的Score值。

标签:窗口,函数,查询,Score,Sql,排名,score
From: https://www.cnblogs.com/Dong-Dong-Xi/p/17711385.html

相关文章

  • 今天安装了SqlServer2005
    手头早就有了一套sqlserver2005,今天上午看了一会儿《sap德国造》,有些累了。想歇息一会儿。在随便浏览电脑的时候,无疑中看到了存储在硬盘上的sqlserver2005安装程序。就猛地萌生了安装它的想法。 虽然sqlserver2005与2000已经区别很大了。但是基于桌面操作系统的应用程序的安装工作......
  • MySQL实战实战系列 03 事务隔离:为什么你改了我还看不见?
    提到事务,你肯定不陌生,和数据库打交道的时候,我们总是会用到事务。最经典的例子就是转账,你要给朋友小王转100块钱,而此时你的银行卡只有100块钱。 转账过程具体到程序里会有一系列的操作,比如查询余额、做加减法、更新余额等,这些操作必须保证是一体的,不然等程序查完之后,还没做......
  • windows导出mysql(mysqldump)
      dump.batechooffclsecho正在初始化环境变量……echo.setbackup_date=%date:~0,4%%date:~5,2%%date:~8,2%setdb_name=db_testecho%backup_date%D:\mysql57\bin\mysqldump-hlocalhost-uudumpmonitor-pmysql-P13306%db_name%--default-character-set=ut......
  • Mysql常用处理
    日期处理时间格式化比较DATE_FORMAT(start_time,'%Y-%m-%d')=DATE_FORMAT(now(),'%Y-%m-%d')时间戳比较,注意有些时间戳会加3个000作为后缀,需格式化处理2.UNIX_TIMESTAMP(NOW())<=UNIX_TIMESTAMP(exam_date)实体字段为null设置配置全局处理字段注解@TableField(up......
  • MySQL 8.0 OCP 最新中文考试题库(如需完整版请联系作者)
    大家好!今天要给大家带来的是由Oracle公司研发的MySQL8.0认证考试试题本次试题是全网最全面的试题,总共包含123道。试题正确率在95%以上。对于在今年报考MySQL8.0中文版本的考生有很大的帮助。特别是考试时所遇到的题型,几乎是原题,本人刚考过,特来为大家分享49.使用带有新配置的旧......
  • MySQL 8.0 OCP 最新中文考试题库(如需完整版请联系作者)
    大家好!今天要给大家带来的是由Oracle公司研发的MySQL8.0认证考试试题本次试题是全网最全面的试题,总共包含123道。试题正确率在95%以上。对于在今年报考MySQL8.0中文版本的考生有很大的帮助。特别是考试时所遇到的题型,几乎是原题,本人刚考过,特来为大家分享49.使用带有新配置的旧......
  • MySQL实战实战系列 02 日志系统:一条SQL更新语句是如何执行的?
    前面我们系统了解了一个查询语句的执行流程,并介绍了执行过程中涉及的处理模块。相信你还记得,一条查询语句的执行过程一般是经过连接器、分析器、优化器、执行器等功能模块,最后到达存储引擎。 那么,一条更新语句的执行流程又是怎样的呢? 之前你可能经常听DBA同事说,MySQL可以......
  • 在MySQL的PREPARE中绑定WHERE IN子句参数
    1.PREPARE简介在MySQL中,PREPARE是一种用于准备执行动态SQL语句的机制。通过PREPARE,你可以将一个SQL查询或操作的查询计划(执行计划)准备好,然后在稍后的时间点执行它,而不是立即执行。这带来了以下好处:SQL注入防护:使用PREPARE可以在准备SQL语句时进行参数绑定,从而防......
  • MySQL——分布式锁
    锁锁是一种抽象概念,是一种思想。并发环境下,多个线程会对同一资源争抢,可能导致数据不一致的问题。因此,很多编程语言都引入了锁。Java中的锁互斥锁(悲观锁(有锁同步))操作系统悲观地认为如果不严格同步线程调用,那么一定会产生异常,互斥锁将会将资源锁定,只供一个线程调用,阻塞其他线程(......
  • 函数指针与指针函数
    int*test(inta,charb){ printf("%d\n",a);}voidtest1(inta){ printf("%d\n",a*a);}voidtest2(inta){ printf("%d\n",a*5);}intmain(){ int*(*p)(int,char)=test; p(10,'1'); return0;......