oracle查询多个字段其中一个字段去重

本文介绍如何在SQL中使用distinct和聚合函数来处理多字段去重和通过单一字段筛选最大值的问题,通过实例演示实现过程并解释其原理。

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

1.distinct是针对多字段完全一样的去重
2.多个字段针对其中一个字段去重:
select * from BB_CREDIT_RESULT where rowid in (select max(rowid) from BB_CREDIT_RESULT group by COURSE_ID)
### 如何在 Oracle 数据库中通过 `DISTINCT` 对多列联合Oracle 数据库中,`DISTINCT` 是一种用于查询结果集中复记录的关键字。当需要对多列进行联合时,可以通过指定这些列作为 `DISTINCT` 的参数实现。需要注意的是,`DISTINCT` 并不单独作用于某一个字段,而是基于所选字段的整体组合来进行判断是否有复项。 以下是具体的方法: #### 方法描述 假设有一张名为 `person` 的表,结构如下: | id | name | age | |----|-------|-----| | 1 | Alice | 25 | | 2 | Bob | 30 | | 3 | Alice | 25 | 如果希望对 `name` 和 `age` 进行联合,则可以在查询语句中使用 `SELECT DISTINCT` 来操作这两列[^4]。 ```sql SELECT DISTINCT name, age FROM person; ``` 上述 SQL 将返回唯一的一组 `(name, age)` 组合。对于上面的例子,执行该查询后的结果将是: | name | age | |-------|-----| | Alice | 25 | | Bob | 30 | #### 注意事项 尽管 `DISTINCT` 可以很好地完成多列联合的任务,但在某些情况下可能无法满足需求。例如,当仅需对其中一列进行并保留其他列的信息时,这种方法就显得不够灵活。此时可以考虑使用窗口函数如 `ROW_NUMBER()` 或者 `RANK()` 结合子查询来解决问题[^3]。 另外值得注意的是,虽然 `LISTAGG` 函数能够将分组内的字符串连接起来形成单一值,但它本身并不具备直接处理复数据的能力。因此,在实际应用过程中若发现由其产生的汇总串存在冗余现象,则应先采取适当措施消除原始输入中的多余条目再调用它[^1]。 #### 示例代码 这里提供一段利用 `ROW_NUMBER()` 实现更复杂场景下(即只针对特定列做的同时保持其余信息不变)的SQL脚本: ```sql WITH RankedData AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY name ORDER BY age DESC) as rn FROM person ) SELECT id, name, age FROM RankedData WHERE rn = 1; ``` 这段程序首先创建了一个临时视图 `RankedData` ,在这个视图里给每一组具有相同名字的人按年龄降序排列编号;接着从这个新构建的数据集合里面挑选出每组里的第一条记录也就是最年长的那个个体展示出来。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值