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只出现一次的数据 这就是去重复了 高人指点 感谢