over在SQL里就什么意思

本文详细介绍了SQL中的分析函数,如RANK(), DENSE_RANK(), ROW_NUMBER()等,并结合OVER子句进行分组排序的应用方法。文章通过具体示例展示了如何在不同部门中进行薪资排名,以及如何生成行号并进行数据处理。

转自:http://zhidao.baidu.com/question/89856341.html

RANK ( ) OVER ( [query_partition_clause] order_by_clause )
DENSE_RANK ( ) OVER ( [query_partition_clause] order_by_clause )
可实现按指定的字段分组排序,对于相同分组字段的结果集进行排序,
其中PARTITION BY 为分组字段,ORDER BY 指定排序字段


over不能单独使用,要和分析函数:rank(),dense_rank(),row_number()等一起使用。
其参数:over(partition by columnname1 order by columnname2)
含义:按columname1指定的字段进行分组排序,或者说按字段columnname1的值进行分组排序。
例如:employees表中,有两个部门的记录:department_id =10和20
select department_id,rank() over(partition by department_id order by salary) from employees就是指在部门10中进行薪水的排名,在部门20中进行薪水排名。如果是partition by org_id,则是在整个公司内进行排名。

以下是个人见解:

sql中的over函数和row_numbert()函数配合使用,可生成行号。可对某一列的值进行排序,对于相同值的数据行进行分组排序。如下表:




执行语句:select row_number() over(order by AID DESC) as rowid,* from bb后的结果如下:



rowid标识行号有了,同时AID也按降序排列。AID有重复的记录,如果要删除rowid为2所对应的记录则可以:

with [a] as

(select row_number() over(order by AID desc) as rowid,* from bb)

delete from [a] where rowid=2

如果查看rowid 为5所对应的记录的信息,可以:

with [b] as

(select row_number() over(order by AID desc) as rowid,* from bb)

select * from [b] where rowid=5

注意:

over里的order只能查查询里的原始数据进行操作,不会对计算出的新值或新字段起作用。

msdn中的说法如下:

<ORDER BY 子句> 只能引用通过 FROM 子句可用的列。<ORDER BY 子句>不能与聚合窗口函数一起使用。

 

<think>好的,用户想了解SQLOVER关键字的作用和使用场景。首先,我需要回忆一下自己对这个关键字的理解。OVER通常和窗口函数一起使用,比如ROW_NUMBER、RANK、SUM等,用于在特定的窗口内进行计算。用户可能已经知道基本的聚合函数,但想了解如何在不使用GROUP BY的情况下进行更灵活的分析。 接下来,我需要参考提供的引用内容。引用3提到OVER是窗口函数的关键字,定义了一个窗口,窗口函数在这个窗口上计算。引用4则指出用户可能对“OVER函数”之类的表述有误解,需要澄清。用户可能希望具体的例子来说明用法,比如如何分区和排序。 然后,我需要组织回答结构。先解释OVER的基本作用,然后说明它的三个核心功能:定义分区、排序和窗口框架。接着,列举常见的使用场景,比如排名、累计计算和移动平均。每个部分都要有示例代码,帮助用户理解。同时,要区分OVER和GROUP BY的不同,强调OVER不会合并行。 还要注意用户可能的应用场景,比如数据分析中的排名需求或财务计算中的移动平均。需要确保示例覆盖这些情况。另外,用户可能关心性能优化,但引用中没有提到,可能需要避免深入讨论性能,除非有相关信息。 最后,生成相关问题,引导用户深入学习,比如优化技巧或不同数据库的支持情况。检查是否符合格式要求,如行内公式用$,独立公式用$$,但这次回答可能不需要数学公式,所以主要注意代码块和引用标识。确保引用正确,比如引用3和4是关于OVER的,其他引用可能不相关,但用户问题中引用了四个,需要核对是否相关。</think>### SQLOVER关键字的作用与使用场景解析 #### 一、OVER关键字的核心作用 `OVER`是SQL窗口函数的核心组成部分,用于**定义数据窗口的边界和计算规则**。与普通聚合函数(如`SUM()`、`AVG()`)不同,`OVER`允许在不合并行的前提下,对特定范围内的数据进行计算[^3][^4]。 #### 二、语法结构解析 ```sql 窗口函数() OVER ( [PARTITION BY 列] -- 定义数据分区 [ORDER BY 列] -- 定义排序规则 [ROWS/RANGE子句] -- 定义窗口范围 ) ``` #### 三、三个核心功能 1. **分区计算** ```sql -- 按部门计算平均工资,同时保留原始行 SELECT name, department, salary, AVG(salary) OVER (PARTITION BY department) AS dept_avg_salary FROM employees; ``` 2. **排序与排名** ```sql -- 按销售额排名(允许并列) SELECT product, sales, RANK() OVER (ORDER BY sales DESC) AS sales_rank FROM products; ``` 3. **窗口范围控制** ```sql -- 计算3个月移动平均(包括前1行到后1行) SELECT month, revenue, AVG(revenue) OVER ( ORDER BY month ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING ) AS moving_avg FROM financials; ``` #### 四、典型应用场景 | 场景类型 | 示例说明 | SQL片段示例 | |------------------|------------------------------------|----------------------------------------------------------------------------| | **排名分析** | 销售排名/部门排名 | `ROW_NUMBER() OVER (PARTITION BY dept ORDER BY sales DESC)` | | **累计计算** | 年度累计销售额/员工累计工龄 | `SUM(sales) OVER (ORDER BY month ROWS UNBOUNDED PRECEDING)` | | **移动计算** | 7日移动平均/季度环比 | `AVG(temp) OVER (ORDER BY date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW)` | | **数据对比** | 与部门平均值的比较 | `salary - AVG(salary) OVER (PARTITION BY dept)` | #### 五、与GROUP BY的对比 | 特性 | GROUP BY | OVER | |--------------------|-----------------------------------|-----------------------------------| | 行合并 | 合并分组行 | 保留所有原始行 | | 计算维度 | 全局分组 | 支持多级分区 | | 排序控制 | 无直接排序控制 | 可定义排序规则 | | 性能影响 | 适合大数据量聚合 | 需要更多内存资源 | #### 六、实际应用建议 1. **避免滥用窗口函数**:在百万级数据量时,优先测试性能 2. **注意数据库兼容性**:不同数据库对窗口函数的支持有差异(如MySQL 8.0+支持) 3. **结合索引优化**:对`PARTITION BY`和`ORDER BY`涉及的列建立索引
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值