oracle去重复的列的sql row_number() over( partition by)

  with cte as(
  select  t.base_group_id,t.base_task_agent_id,t.user_id,g.base_role_id,r.role_name,g.base_org_id,o.name_,t.ben_time,t.end_time 
  from base_task_agent t,base_role r,base_organization o,base_group g,base_user u 
  where u.user_id =756550 and u.user_id = t.user_id and t.base_group_id = g.base_group_id and g.base_role_id = r.role_id and g.base_org_id = o.org_id and t.end_time > to_Date('2012-01-05', 'yyyy-MM-dd')
  )
  select * from (
  select t.*,row_number() over (partition by base_group_id order by base_task_agent_id) rid from cte t
  ) a  where rid=1



简单解释一下    with cte  as() 括号内的内容 就是查询的sql 结果 其中包含重复数据,单纯的distinct无法解决 order by也不知怎么搞  于是用with as() 创建一个临时表  cte为临时表的名字

然后

select   t.* ,row_number() over(partition by base_group_id order by base_task_agent_id) rid from cte t 这句sql的意思是  查询临时表cte  别名为t   row_number() over(partition by 需要检索重复的列 order by 排序的列名)  别名为 rid  form cte t

这时候查询就会获得一个rid列  如果base_group_id存在多条相同值就以1开始递增  


select * from (↑) a where rid = 1  筛选rid为1  也就是base_group_id只出现一次的数据   这就是去重复了    高人指点  感谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值