`
MauerSu
  • 浏览: 497860 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

开窗函数 --over()

    博客分类:
  • SQL
 
阅读更多
源:https://www.cnblogs.com/com-xiaolanchong/p/5796579.html
评:

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

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

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,第三个参数是 超出记录窗口时的默认值)
分享到:
评论

相关推荐

    oracle分析函数over_及开窗函数.txt

    oracle分析函数,oracle分析函数over_及开窗函数用法。

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

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

    oracle开窗函数学习技巧总结

    oracle开窗函数学习技巧总结,主要讲解over函数的使用的哦

    oracle分析函数及开窗函数

    oracle分析函数及开窗函数的使用,包括over等分析函数

    SQL开窗函数的基本概念、用法以及一些常见的开窗函数

    SQL开窗函数(Window Functions)是SQL中用于在结果集的每一行上执行计算的一类函数。它们通常与OVER()子句一起使用,以定义窗口或分区,并在这些窗口或分区上执行计算。开窗函数为分析型查询提供了强大的工具,使您...

    SQL开窗函数详解.pdf

    SQL开窗函数通常使用OVER子句来定义窗口,并在窗口上执行相关的计算。以下是一些常用的开窗函数及其功能: 以上只是SQL开窗函数的一些常用功能示例,实际上开窗函数的功能非常强大,并且可以与其他聚合函数、分组...

    Oracle 语法之 OVER (PARTITION BY ..) 及开窗函数(转载)

    Oracle 语法之 OVER (PARTITION BY ..) 及开窗函数(转载),这个命令很实用,对于分析人员经常用到。

    Mysql 集合运算,伪列,开窗函数及示例代码

    MySql只支持Union(并集)集合运算;但是对于交集Intersect、差集Except,就没有实现了。一般的解决方案用in和not in来解决,小量数据还可以,但数据...伪列:实现类似Oracle,MySqlServer的Over() partition by 开窗函数

    SQL开窗函数介绍以及示例

    sql开窗函数详解 SQL开窗函数(Window Functions)是一种用于在查询结果集中执行聚合、排序和分析操作的强大工具。它们可以在不破坏查询结果集的情况下,对每一行数据进行计算,比如计算行的排名、累计和、移动平均...

    SQL Server 开窗函数 Over()代替游标的使用详解

    前言: 今天在优化工作中遇到的sql慢的问题,发现以前用了挺多游标来处理数据,这样就导致在数据量多的情况下,需要一行一行去...下面模拟工作中通过开窗函数代替游标的例子,通过期初余额与单据的预收金额、应收金额

    敲黑板啦!开窗函数你学会了吗

    特征分析与偏移分析什么是开窗函数?学习目标:1、累计计算窗口函数(1)sum(…) over(……)(2)avg(…) over(……)(3)语法总结:2、分区排序窗口函数3、分组排序窗口函数4、偏移分析窗口函数练习总结: 什么是开...

    sql server如何利用开窗函数over()进行分组统计

    主要介绍了sql server利用开窗函数over()进行分组统计的相关资料,需要的朋友可以参考下

    Sql Server 开窗函数Over()的使用实例详解

    主要介绍了Sql Server 开窗函数Over()的使用,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下

    SQL Server 2012 开窗函数

    -- 开窗函数:在结果集的基础上进一步处理(聚合操作) -- Over函数,添加一个字段显示最大年龄 SELECT * , MAX(StuAge) OVER ( ) MaxStuAge FROM dbo.Student; -- Over函数,添加一个字段显示总人数 SELECT * , COUNT...

    SQL2005 学习笔记 窗口函数(OVER)

    也就是说窗口函数是结合排名开窗函数或者聚合开窗函数一起使用 OVER子句前面必须是排名函数或者是聚合函数 3.例题: 代码如下: –建立订单表 create table SalesOrder( OrderID int, –订单id OrderQty dec

    ORACLE分析函数

    Oracle分析函数RANK(),ROW_NUMBER(),LAG()等的使用方法 Oracle分析函数参考手册 开窗函数(over)详解

    使用over函数实现递归汇总计算

    Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是对于每个组返回多行,而聚合函数对于每个组只返回一行。

Global site tag (gtag.js) - Google Analytics