Oracle使用row_number over和partition实现分组排序查询最新数据
官方文档#
语法阐释#
ROW_NUMBER( ) OVER ([ query_partition_clause ] order_by_clause)
具体解释#
ROW_NUMBER
is an analytic function. It assigns a unique number to each row to which it is applied (either each row in the partition or each row returned by the query), in the ordered sequence of rows specified in the order_by_clause
, beginning with 1.
By nesting a subquery using ROW_NUMBER
inside a query that retrieves the ROW_NUMBER
values for a specified range, you can find a precise subset of rows from the results of the inner query. This use of the function lets you implement top-N, bottom-N, and inner-N reporting. For consistent results, the query must ensure a deterministic sort order.
ROM_NUMBER是一个解析函数。它给每一个所应用在order by语句描述行的有序序列的每一行(要么是分区中的每一行,要么是查询返回的每一行)分配一个唯一数字,从1开始
通过在检索指定范围查询种使用ROW_NUMBER潜逃一个子查询,可以从内部查询的结果中找到精确的行子集。
使用此函数可以实现top-N、bottom-N和inner-N报告。为了获得一致的结果,查询必须确保一个不可逆的排序顺序。
具体案例#
中欧基金的的这个产品管理系统,客户提出要统计每个产品底下的资产规模日期最新的那条数据
产品是一张表,资产规模是一张表,两者用一个叫bisid的字段进行关联
我对sql不熟悉,同事用了row_number() over(partition by)这个语法,所以不得不去Oracle官网查一下
为了保密,表结构就不给了,看下实现语句吧
sql语句#
select sum(fund_asset) from ( select t1.* from (select t.*,row_number() over(partition by t.bisid order by tdate desc) as rowindex from PMS_ASSET_SIZE t ) t1 where t1.rowindex = '1');
通俗地来讲,partition就是分区,order by就是排序,分区排序后的结果,每一行都有一个唯一标识,是数字类型
通过这个唯一标识我们可以拿到第一条,即最新的那条
作者:BigBender
出处:https://www.cnblogs.com/BigBender/p/14821498.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2020-05-28 和差化积与积化和差