oracle 分组后取每组第一条数据

本文介绍了如何在Oracle数据库中,针对已分组的数据,通过SQL查询获取每个分组内的第一条记录。关键在于使用PARTITION BY进行分组,并结合排序来实现这一目标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为项目中需要将结果集中的相同分组中的数据在组内排序然后再分别取出每个分组的第一条记录,所以研究了下 

ROW_NUMBER() OVER(PARTITION BY x ORDER BY y DESC)

主要思路就是根据不同分组创建一个字段进行组内排序,PARTITION BY 是按照某字段分组,例子如下:

数据格式

分组取第一条的效果


sql

 

 SELECT *       
    FROM (SELECT ROW_NUMBER() OVER(PARTITION BY x ORDER BY y DESC) rn,       
          test1.*       
          FROM test1)       
   WHERE rn = 1  ;  

### Oracle 中按 GROUP BY 分组每组第一条记录的查询方法 在 Oracle 数据库中,可以通过使用分析函数 `ROW_NUMBER()` 来实现对数据按某个字段分组,并从每组中提第一条记录。以下是一个详细的实现方法和解释。 #### 使用 `ROW_NUMBER()` 实现分组第一条记录 `ROW_NUMBER()` 是一个分析函数,用于为每一行分配一个唯一的序号,基于指定的分区和排序规则。以下是具体的 SQL 示例: ```sql SELECT type, code FROM ( SELECT z.type, z.code, ROW_NUMBER() OVER (PARTITION BY z.type ORDER BY z.code) AS rn FROM group_info z ) WHERE rn = 1; ``` - 在子查询中,`ROW_NUMBER()` 函数通过 `PARTITION BY z.type` 将数据按 `type` 字段进行分组[^1]。 - 每组内的记录按照 `ORDER BY z.code` 进行排序[^2]。 - 外层查询通过 `WHERE rn = 1` 筛选出每组中的第一条记录。 #### 具体语法解析 根据 Oracle 的分析函数文档,分析函数的结构如下: ```plaintext analytic_function ([ arguments ]) OVER (analytic_clause) ``` 其中 `analytic_clause` 包括: - `query_partition_clause`:由 `PARTITION BY` 引导,用于定义分组逻辑[^2]。 - `order_by_clause`:由 `ORDER BY` 引导,用于定义每组记录的排序规则[^2]。 #### 示例扩展 如果需要从另一个表中提类似的结果,可以参考以下 SQL: ```sql SELECT type, money FROM ( SELECT t.type, t.money, ROW_NUMBER() OVER (PARTITION BY t.type ORDER BY t.time DESC) AS rn FROM table1 t ) WHERE rn = 1; ``` - 在此示例中,`ORDER BY t.time DESC` 表示每组内的记录按照时间字段降序排列[^2]。 - 最终筛选出每组中时间最新的第一条记录。 #### 注意事项 1. `ROW_NUMBER()` 函数会为每一行分配唯一的序号,因此即使存在重复值,也不会影响结果。 2. 如果需要处理更复杂的逻辑(例如窗口函数或滑动窗口),可以结合 `windowing_clause` 使用[^2]。 #### 总结 通过使用 `ROW_NUMBER()` 分析函数,可以高效地实现按 `GROUP BY` 分组每组第一条记录的需求。上述方法不仅适用于简单场景,还可以扩展到更复杂的业务需求中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值