rank 开窗函数_开窗函数 --over()

一个学习性任务:每个人有不同次数的成绩,统计出每个人的最高成绩。

这个问题应该还是相对简单,其实就用聚合函数就好了。

select id,name,max(score) from Student group by id,name order by name

上边这种情况只适用id 和name是一一对应的,否则查询出来的数据是不正确的。

例如 : 1 张三 100

2 张三 90

查询出来的结果

两条信息都会输出。

避免这种情况,可以使用开窗函数。

个人理解就是,开窗函数和聚合函数功能是相反的。

聚合函数,将多行数据合并成一行数据;而开窗函数则是将一行数据拆分成多行。

开窗函数可以满足上述问题,同事也可以满足其他问题。例如:求每个班最高成绩学生的信息。

分析:每个人学号一定是不同的,名字可能有重名,最大复杂的情况是,每个班最高成绩可能不止一个。

如果继续使用开始的方式,那么是不能满足要求的。

使用开窗函数就能很好的解决这个问题。

--每个班级的成绩第一的学生

--学生表中信息如下

a 1 80

b 1 78

c 1 95

d 2 74

e 2 92

f 3 99

g 3 99

h 3 45

i 3 55

j 3 78

查询结果如下:

c 1 95 1

e 2 92 1

f 3 99 1

g 3 99 1

SQL查询语句如下:

select *

from

(

select name,class,s,rank()over(partition by class order by s desc) mm

from t2

) as t

where t.mm=1

心得:

rank()跳跃排序,有两个第二名时后边跟着的是第四名

dense_rank() 连续排序,有两个第二名时仍然跟着第三名

over()开窗函数:在使用聚合函数后,会将多行变成一行,

而开窗函数是将一行变成多行;

并且在使用聚合函数后,如果要显示其他的列必须将列加入到group by中,

而使用开窗函数后,可以不使用group by,直接将所有信息显示出来。

开窗函数适用于在每一行的最后一列添加聚合函数的结果。

常用开窗函数:

1.为每条数据显示聚合信息.(聚合函数() over())

2.为每条数据提供分组的聚合函数结果(聚合函数() over(partition by 字段) as 别名) --按照字段分组,分组后进行计算

3.与排名函数一起使用(row number() over(order by 字段) as 别名)

常用分析函数:(最常用的应该是1.2.3 的排序)

1、row_number() over(partition by ... order by ...)

2、rank() over(partition by ... order by ...)

3、dense_rank() over(partition by ... order by ...)

4、count() over(partition by ... order by ...)

5、max() over(partition by ... order by ...)

6、min() over(partition by ... order by ...)

7、sum() over(partition by ... order by ...)

8、avg() over(partition by ... order by ...)

9、first_value() over(partition by ... order by ...)

10、last_value() over(partition by ... order by ...)

11、lag() over(partition by ... order by ...)

12、lead() over(partition by ... order by ...)

lag 和lead 可以 获取结果集中,按一定排序所排列的当前行的上下相邻若干offset 的某个行的某个列(不用结果集的自关联);

lag ,lead 分别是向前,向后;

lag 和lead 有三个参数,第一个参数是列名,第二个参数是偏移的offset,第三个参数是 超出记录窗口时的默认值)

开窗函数 First_Value 和 Last_Value

在Sql server 2012里面,开窗函数丰富了许多,其中带出了2个新的函数 First_Value 和 Last Value .现在来介绍一下这2个函数的应用场景. 首先分析一下First_Va ...

Oracle开窗函数 over()(转)

copy文链接:http://blog.csdn.net/yjjm1990/article/details/7524167#,http://www.2cto.com/database/201402/2 ...

oracle的分析函数over 及开窗函数

转:http://www.2cto.com/database/201310/249722.html oracle的分析函数over 及开窗函数   一:分析函数over   Oracle从8.1.6开 ...

SQL使用开窗函数与CTE查询每月销售额的前几名

WITH tagTab AS( SELECT YearMonth, pm=RANK() OVER(PARTITION BY YearMonth ORDER BY amount DESC) FROM S ...

利用OVER开窗函数分页

在SQL Server中,利用SQL进行分页的方法也有很多,今天要总结的是SQL Server 2005中引入的OVER开窗口函数,然后利用开窗函数进行分页. 示例代码如下: -- 设置数据库上下文 ...

sqlserver开窗函数

从 http://jimshu.blog.51cto.com/3171847/1376637/ 转 开窗函数是在 ISO 标准中定义的.SQL Server 提供排名开窗函数和聚合开窗函数. 在开窗函 ...

SQL ServerOVER 子句,over开窗函数,SQL SERVER 开窗函数

https://technet.microsoft.com/zh-cn/library/ms189461(v=sql.105).aspx http://www.cnblogs.com/85538649 ...

sql over开窗函数,

sql over开窗函数, 1.使用over子句与rows_number()以及聚合函数进行使用,可以进行编号以及各种操作.而且利用over子句的分组效率比group by子句的效率更高. 2.在订单 ...

随机推荐

SAS零散知识总结

1,变量名命名规范:以字母或者下划线开始,可包含字母.下划线.数字,且不超过32个字符: 2,INFILE用于读取外部数据文件,一般于FILENAME(和LIBNAME用户一致,但路径要精确到文件名( ...

Android源码笔记——Camera系统架构

Camera的架构与Android系统的整体架构保持一致,如下图所示,本文主要从以下四个方面对其进行说明. Framework:Camera.java Android Runtime:android_ ...

【BZOJ】【2132】圈地计划

网络流/最小割 Orz Hzwer 这类大概是最小割建模中的经典应用吧…… 黑白染色,然后反转黑色的技巧感觉很巧妙!这个转化太神奇了…… /****************************** ...

Java NIO原理图文分析及代码实现

原文: http://weixiaolu.iteye.com/blog/1479656 目录: 一.java NIO 和阻塞I/O的区别      1. 阻塞I/O通信模型      2. java ...

关于SRAM,DRAM,SDRAM,以及NORFLASH,NANDFLASH

韦东山的视频里面说S3C2440有4KB的内存,这个其实是不正确的,这4KB的RAM严格说不应该叫内存,严格来说芯片外面的64MB的SDRAM才能叫做内存,里面的那4KB只是当nandflash启动的 ...

mybatis的配置与使用

mybatis的配置与使用 一.全局配置文件配置 properties标签 Properties标签可以用来加载配置文件.例如,我们可以将数据库的连接信息放入到一个配置文件(db.properties ...

microsoft.jet.oledb.4.0 未注册

64位系统已经不支持4.0 解决办法 1.下载 ACE2010的驱动,64位的. http://www.microsoft.com/downloads/zh-cn/details.aspx?famil ...

JavaScript设计模式 - 订阅发布模式(观察者模式)

var Event = (function() { var global = this, Event, _default = 'default'; Event = function() { var _ ...

centos安装autossh

$ sudo yum install wget gcc make$ wget http://www.harding.motd.ca/autossh/autossh-1.4e.tgz$ tar -xf ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值