ROW_NUMBER() OVER ,ROWNUM , OVER()

本文详细介绍了Oracle SQL中OVER函数的应用场景,包括如何利用PARTITION BY进行数据分组汇总及ROW_NUMBER函数在分组排序中的使用技巧。
部署运行你感兴趣的模型镜像

Oracle 语法之 OVER (PARTITION BY ..)

select * from test

数据:
A   B   C
1   1   1
1   2  2
1   3   3
2   2  5
3   4  6


---将B栏位值相同的对应的C 栏位值加总
select a,b,c, SUM(C)  OVER (PARTITION BY B) C_Sum
from test

A   B   C   C_SUM 
1 1 1 1
1 2 2 7
2 2 5 7
1 3 3 3
3 4 6 6



---如果不需要已某个栏位的值分割,那就要用 null

  eg:  就是将C的栏位值summary 放在每行后面

select a,b,c, SUM(C)  OVER (PARTITION BY null) C_Sum
from test

A   B   C   C_SUM 
1 1 1 17
1 2 2 17
1 3 3 17
2 2 5 17
3 4 6 17

this part from: http://www.itpub.net/324056.html

 

row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的).


  与rownum的区别在于:使用rownum进行排序的时候是先对结果集加入伪列rownum然后再进行排序,而此函数在包含排序从句后是先排序再计算行号码.

借用上面的数据

select a,b,c,rownum from AA order by b

a b c rownum

1 1 1 1
1 2 2 2
2 2 5 4
1 3 3 3
3 4 6 5

  row_number()和rownum差不多,功能更强一点(可以在各个分组内从1开时排序).

 

select a,b,c,row_number() OVER (PARTITION BY b order by a)  from AA  order by a

a b c rownum

1 1 1 1
1 2 2 1
1 3 3 1
2 2 5 2
3 4 6 1

select a,b,c,row_number() OVER (PARTITION BY b order by a)  from AA  order by b

a b c rownum
1 1 1 1
1 2 2 1
2 2 5 2
1 3 3 1
3 4 6 1

select a,b,c,row_number() OVER (PARTITION BY b order by a)  from AA 

a b c rownum

1 1 1 1
1 2 2 1
2 2 5 2
1 3 3 1
3 4 6 1

您可能感兴趣的与本文相关的镜像

GPT-SoVITS

GPT-SoVITS

AI应用

GPT-SoVITS 是一个开源的文本到语音(TTS)和语音转换模型,它结合了 GPT 的生成能力和 SoVITS 的语音转换技术。该项目以其强大的声音克隆能力而闻名,仅需少量语音样本(如5秒)即可实现高质量的即时语音合成,也可通过更长的音频(如1分钟)进行微调以获得更逼真的效果

在SQL中,`ROW_NUMBER()` 是一个窗口函数,用于为结果集中的每一行分配一个唯一的序号。当与 `LIMIT` 结合使用时,可以实现高效的分页查询排序筛选功能。以下是几种常见的使用方法及场景: ### 1. 分页查询 通过 `ROW_NUMBER()` 对数据进行全局排序,并结合子查询与 `LIMIT` 实现高效分页。例如,在 MySQL 中可以通过如下方式实现分页: ```sql SELECT * FROM ( SELECT ROW_NUMBER() OVER (ORDER BY create_time DESC) AS row_num, id, title, create_time FROM articles ) AS tmp WHERE row_num BETWEEN 11 AND 20; ``` 此查询获取第 2 页的数据(每页 10 条记录),其中 `create_time` 字段是降序排列的依据 [^2]。 ### 2. 去重并保留最新记录 在需要保留每组最新或第一条记录的情况下,可以使用 `ROW_NUMBER()` 进行去重操作。例如,按某字段分组并保留每组的第一条记录: ```sql SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY group_column ORDER BY timestamp_column DESC) AS rn FROM your_table ) AS subquery WHERE rn = 1; ``` 该查询按照 `group_column` 分组,并且每组内按照 `timestamp_column` 排序后取第一条记录 [^2]。 ### 3. 在子查询中先排序再编号 某些数据库如 Greenplum 或 PostgreSQL 支持在子查询中先进行排序然后再添加编号的方式。例如: ```sql SELECT ROW_NUMBER() OVER () AS "rowNum", T.* FROM ( SELECT recommend_field AS "recommendField", recommend_value AS "recommendValue", sort_tag AS "sortTag" FROM data_recommend_car WHERE recommend_field = 'imsi' ORDER BY sort_tag DESC ) T LIMIT 5 OFFSET 0; ``` 这个例子中,首先对子查询的结果按照 `sort_tag` 进行降序排序,然后在外层查询中为每一行添加编号,并限制返回的行数 [^3]。 ### 4. 与 LIMIT 配合实现更灵活的分页 尽管 `ROW_NUMBER()` 已经可以完成复杂的分页需求,但在一些特定情况下,仍然可以将 `ROW_NUMBER()` `LIMIT` 结合使用来实现更加灵活的分页逻辑。例如,先生成带有行号的结果集,然后根据行号范围进行过滤。 ```sql SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (ORDER BY some_column) AS row_number FROM your_table ) AS numbered WHERE row_number BETWEEN 1 AND 10 LIMIT 10; ``` 这种方式适用于需要对数据进行全局排序后再分页的情况 。 ### 总结 - 使用 `ROW_NUMBER()` 窗口函数可以实现复杂的数据编号逻辑。 - 结合 `LIMIT` `OFFSET` 可以实现高效的分页查询。 - 在不同的数据库系统中,语法可能略有不同,但基本思路一致。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值