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只出现一次的数据   这就是去重复了

你可能感兴趣的:(row_number())