ORACLE GROUP BY 如何去重 小汇

 

2010年12月17日14:30:02

例如有如下表结构和值
table
fid name sex
1    a       男   
2    b       男
3    c        女
4    d        女
5    a       男
6    b       男
方案一:distinct
select distinct name from table
得到结果:
name
a
b
c
d
实现效果,那如果要同时打开其它记录呢?再试试
select distinct name,id from table
测试没什么效果,查下得知,这样实际是要name和id字段都重复才被筛选。继续查找可得如下方法:
方案二:group by
select *, count(distinct name) from table group by name
Oracle下测试失败,据说MYSQL下通过,不管,继续思考....
翻翻书,试试
select min(fid),name,sex from table group by name (此处从别处网摘,个人认为该是这样:GROUP BY name,sex)
成功,现实如下结果:
fid name sex
1     a        男
2     b        男
3     c         女
4     d        女
继续思考,如果要打开所有记录,不指定字段用(*),貌似这方法就不行了!
select * from table where fid in(Select min(fid) FROM table group by name)
测试成功
fid name sex
1      a         男
2      b         男
3      c          女
4      d          女
方案三:
所有某字段不重复的记录
select * from table where name in(select name from table group by name having count(name)=1)
得到如下结果:
fid name sex
1       a       男
2       b       男
5       a       男
6       b       男
再多的字段都全部现实。哎,原来如此简单!回顾网上方法distinct,Inner Join等等,麻烦,而且有很大局限性.
总结如下:
select distinct name from table查询不重复记录的单个字段
select * from table where fid in(Select min(fid) FROM table group by name)查询不重复记录的所有字段值
select * from table where name in(select name from table group by name having count(name)=1)查询不重复(可设定重复数为任意次数)的所有记录
************************************************************************************************

方案四:是我自己用的,大数据量的时候 in 的执行效果,让人望而却步,遂继续找。
用distinct关键字只能过滤查询字段中所有记录相同的(记录集相同),而如果要指定一个字段却没有效果,distinct使用的是二重循环来去重的,如果数据量非常大的时候,会导致性能急剧下降。
效率很低 。

select distinct name from tbl1 能消除重复记录,但只能取一个字段,现在要同时取id,name这2个字段的值。

select distinct id,name from tbl1 可以取多个字段,但只能消除这2个字段值全部相同的记录

所以用distinct达不到想要的效果,用group by   可以解决这个问题。

例如要显示的字段为A、B、C三个,而A字段的内容不能重复可以用下面的语句:

 

select A, min(B),min(C),count(*) from [table] where [条件] group by   A

having [条件] order by A desc

**********************************************************************************************

下面是自己的实验,创建表:
 

SELECT MIN(D.ID)ID ,D.NAME,D.DEPT   FROM S_EMP D  GROUP BY D.NAME,D.DEPT ORDER BY ID ASC;

另外一种写法:

SELECT C.NAME ,C.DEPT ,MAX(ROWID) SYS_ID FROM S_EMP C GROUP BY C.NAME,C.DEPT ;

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Oracle中的GROUP BY语句可以用于去重。它将根据指定的列对结果进行分组,并将每个组的唯一值返回。例如,以下查询将返回每个不同的部门名称和该部门的员工数量: SELECT department_name, COUNT(*) FROM employees GROUP BY department_name; 在这个例子中,GROUP BY语句将结果按照部门名称进行分组,并计算每个组中的员工数量。这将返回一个包含每个不同部门名称和该部门员工数量的结果集,而不会包含重复的部门名称。 ### 回答2: Oracle中的GROUP BY是一种非常常用的查询操作,它可以对相同的数据进行汇总计算,并可以通过去重实现数据的归类和分组。GROUP BY指定的列将成为查询结果集中的分组依据。 Oracle中的GROUP BY语句可以用来消除数据中的重复记录。在一个查询中,如果有一个表包含了多行与其他表中的数据相关,则需要使用GROUP BY语句来减少或消除重复的行。 以学生表为例,如下: | 学生编号 | 学生姓名 | 学生性别 | 学生成绩 | | -------- | -------- | -------- | -------- | | 001 | 张三 | 男 | 85 | | 002 | 李四 | 男 | 92 | | 003 | 王五 | 女 | 91 | | 001 | 张三 | 男 | 72 | 使用GROUP BY学生编号,学生姓名,学生性别,学生成绩,可以将重复的行去除,只显示每个组的第一项,即: | 学生编号 | 学生姓名 | 学生性别 | 学生成绩 | | -------- | -------- | -------- | -------- | | 001 | 张三 | 男 | 85 | | 002 | 李四 | 男 | 92 | | 003 | 王五 | 女 | 91 | GROUP BY语句中可以同时使用多列进行分组: ``` SELECT 学生姓名,学生性别,AVG(学生成绩) FROM 学生信息 GROUP BY 学生姓名,学生性别; ``` 这将按学生姓名和学生性别把学生成绩平均值相等的行合并为一行。 总之,使用GROUP BY语句可以减少或消除查询结果集中的重复行。GROUP BY语句的语法简单,但功能强大。在实际查询时,只需要按需求选择GROUP BY语句中需要分组的字段,即可实现不同的查询。 ### 回答3: Oracle Group By是一个很常用的数据库查询语句,它可以根据指定的列将数据行分组后,对每个组进行聚合并计算结果。在实际应用中,Group By语句常常用于数据统计、数据分析等领域。 在使用Group By语句时,需要注意去重的问题。有时候,同一个分组中会存在多个重复的数据行,这时候,需要使用Group By去重来保证计算结果的准确性。 具体来说,Group By去重可通过在Group By语句中添加Distinct关键字实现。例如,假设我们需要计算学生表中各个年龄段的人数,但是表中可能存在同一个年龄的人有多条记录的情况,因此需要使用Group By去重操作。具体的查询语句如下: select age, count(distinct id) from student group by age; 在上述查询语句中,我们使用了Distinct关键字,它的作用是保证每个分组只包含不同的ID值,从而避免了同一个分组重复数据的问题。最终查询结果将会展示各个年龄段的人数,而不会受到重复数据的影响。 除了使用Group By语句中的Distinct关键字去重,还可以使用子查询、临时表等方式实现。但无论采用哪种方法,都需要保证去重的准确性和高效性,以避免出现计算错误和性能问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值