`
MauerSu
  • 浏览: 514414 次
  • 性别: 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分析函数OVER及开窗函数详解 #### 一、概述 在Oracle数据库中,分析函数(Analytic Functions)是一种非常强大的工具,用于处理复杂的查询需求。这些函数可以在一组相关的行上执行计算,并且每行返回一个...

    oracle开窗函数学习技巧总结

    `OVER`函数是Oracle开窗函数的核心组成部分,它定义了一个计算上下文或窗口,在这个窗口内可以执行各种类型的聚合计算。`OVER`函数的基本语法如下: ``` function_name(...) OVER (window_specification) ``` 其中...

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

    ### Oracle的分析函数OVER及开窗函数 #### 一、分析函数OVER ##### 1. 概念介绍 从Oracle 8.1.6版本开始,Oracle引入了分析函数,这些函数可以对分组的数据执行复杂的操作,如计算累积总和、排名等。与聚合函数...

    oracle分析函数及开窗函数

    开窗函数的`OVER`子句可以包含以下几种类型: 1. **PARTITION BY**:将数据集分割成多个分区,在每个分区上分别进行计算。 2. **ORDER BY**:指定窗口内行的顺序。 3. **ROWS BETWEEN** / **RANGE BETWEEN**:指定...

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

    ### Oracle 语法之 OVER (PARTITION BY ..) 及开窗函数详解 #### 一、OVER (PARTITION BY ..) 概述 在Oracle数据库中,`OVER (PARTITION BY ...)` 是一种非常强大的功能,它允许用户在数据集上进行窗口操作。这在...

    SQL开窗函数详解.pdf

    2. **OVER()子句**:定义了开窗函数的作用范围。如果没有指定`PARTITION BY`子句,则开窗函数在整个结果集上操作;如果指定了`PARTITION BY`子句,则开窗函数会在每个分区上独立操作。 3. **PARTITION BY 子句**:该...

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

    ### SQL开窗函数详解 #### 一、基本概念 ##### 窗口(Window) - **定义**: 在SQL中,开窗函数定义了一个窗口,这个窗口可以覆盖整个查询结果集或者仅是结果集的一部分(即分区)。 - **作用**: 在窗口上执行的...

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

    本文将详细介绍如何使用开窗函数Over()来优化这类问题。 1. **Row_Number() 函数结合使用** Row_Number() 函数与Over()一起使用,可以为结果集中的每一行分配一个唯一的序列号。这在需要按特定顺序对数据进行排序...

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

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

    SQL开窗函数介绍以及示例

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

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

    【Sql Server 开窗函数Over()的使用实例详解】 在SQL Server中,`OVER()`函数是一个非常强大的工具,它允许我们在不使用`GROUP BY`的情况下进行分组计算,并且可以直接筛选结果集,极大地提高了查询效率。这里我们...

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

    本文将重点讨论如何使用开窗函数`OVER()`来解决分组统计的问题,以及介绍一些常见的窗口函数类型。 首先,我们来看标题中提到的需求:求出以产品类别为分组,各个分组里价格最高的产品信息。这里可以通过两种方法...

    SQL中的开窗函数详解可代替聚合函数使用

    开窗函数的基本语法形式为:`函数名(列) OVER(选项)`。其中,`OVER`关键字用于定义计算的窗口。如果`OVER`后的括号为空,那么函数将作用于整个结果集。如果想按某个字段分组,可以使用`PARTITION BY`,例如:`聚合...

    hive开窗函数详细介绍

    本文将详细探讨Hive的开窗函数,包括ROW_NUMBER、RANK、DENSE_RANK以及分析窗口函数SUM、AVG、MIN和MAX的用法。 一、窗口函数 1. ROW_NUMBER() ROW_NUMBER()函数为每个分区内的记录分配一个唯一的连续编号,根据...

    over函数的使用

    ### 开窗函数的窗口范围 除了上述的`PARTITION BY`和`ORDER BY`,`OVER`还可以定义窗口范围,即确定计算时所考虑的数据行范围。这可以通过`RANGE`或`ROWS`关键字来实现: - **RANGE**定义了一个基于值的窗口范围,...

    开窗函数有浅入深详解(一)

    开窗函数是SQL查询中的一个强大工具,它允许在单个SQL语句中对一组行进行复杂的计算,而不仅仅是聚合操作。在SQL标准中,开窗函数是在2003年的ISO SQL标准引入的,目的是解决一些需要复杂子查询或存储过程才能解决的...

    Oracle数据库中SQL开窗函数的使用

    上述SQL语句中,`AVG(fsalary) OVER (PARTITION BY fcity)`就是开窗函数的使用,它将`fcity`相同的记录分为一组,对每组内的`fsalary`进行平均值计算,这样每条记录就会包含该员工所在城市的平均工资。 另外,如果...

    hive开窗函数.docx

    Hive 开窗函数是数据分析和处理中的重要工具,它们允许用户在特定的数据集窗口内执行复杂的计算和分析,而不仅仅是对整个数据集进行全局操作。这些函数极大地增强了 Hive 查询的能力,使得用户能够处理更复杂的业务...

    SQL开窗函数.zipSQL开窗函数.zipSQL开窗函数.zip

    SQL开窗函数是数据库查询中的一个强大工具,它允许在单个SQL语句中进行复杂的分析操作,如计算累计和、排名、移动平均等。在SQL中,窗口(或称为分区)是根据某些条件对数据集进行分组的一段连续记录。通过使用窗口...

Global site tag (gtag.js) - Google Analytics