Oracle 去重复查询问题 !求助!

[复制链接]
查看11 | 回复4 | 2011-8-19 07:20:00 | 显示全部楼层 |阅读模式
按照Subsid和serv_code字段查询serv_code、serv_name、serv_time字段信息,其中要求serv_code字段不可重复,如果serv_code字段相同其他字段不相同(如数据MID为1和2的两项)也需要去重复。如果多条数据重复,按照serv_time排序,取最近的一条数据。用查询语句实现,只需查找数据,不要对数据库进行删除操作。原始数据:SubsidMID(主键)Accesschannelsserv_codeserv_nameserv_time150123456781100DX短信2011-7-20150123456782100DX短信2011-7-21150123456783100CX彩信2011-7-13150123456784100FX飞信2011-7-19150123456785100DX短信2011-7-19查询后:150123456782100DX短信2011-7-20150123456785100FX飞信2011-7-19150123456783100CX彩信2011-7-13
回复

使用道具 举报

千问 | 2011-8-19 07:20:00 | 显示全部楼层
1.首先要知道都有什么字段重复了selectserv_codeas重复键值fromservgroupbyserv_codehavingcount(serv_code)=2这里是为了得到重复字段的键值1,2,3,4……2.重复记录按照serv_time排序,取最近的一条数据createVIEWserv_dasselect*fromservwhereserv_code=重复字段的键值1andrownum=1orderbyserv_timeDESCinsertintoserv_dselect*fromservwhereserv_code=重复字段的键值2andrownum=1orderbyserv_timeDESC……把每个重复字段的第一条记录都插入到视图serv_d中去3.最后把不重复的字段再插入serv_d中,排序好就可以了insertintoserv_dselect*fromwhereserv_codeNOTIN(重复字段的键值1,2,3,4……)orderbySubsidDESC查询不重复的记录select*fromserv_d删除此视图dropVIEWserv_d追问谢谢你,不过视图是个虚表,没法往里面再添加数据了,所以你的第三部没法继续下去了。
回复

使用道具 举报

千问 | 2011-8-19 07:20:00 | 显示全部楼层
那么第二步把VIEW改成TABLE,新建一张表,第三步就可以实现了。看完以后,删除表就可以了。
回复

使用道具 举报

千问 | 2011-8-19 07:20:00 | 显示全部楼层
select*from表a,(selectserv_code,max(serv_time)serv_timefrom表groupbyserv_code)bwherea.serv_code=b.serv_codeanda.serv_time=b.serv_time
回复

使用道具 举报

千问 | 2011-8-19 07:20:00 | 显示全部楼层
原始数据:150123456784100FX飞信2011-7-19查询后:150123456785100FX飞信2011-7-19查询还要影响MID的数值的么?SELECT*FROM表名称mainWHERENOTEXISTS(SELECT1FROM表名称subWHEREmain.serv_code=sub.serv_codeANDmain.serv_timesub.serv_time)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行