比如我有这样的一张表 dataTableid   用户1编号    用户1姓名     用户2编号   用户2姓名    用户间关系
--------------------------------------------------------------
id  user_num_1 user_name_1 user_num_2 user_name_2 relation_name
1    001         张小三       002         李四         老师
2    001         张小         002         李四         老师
3    003         赵老五       004         欧阳青山     家长
4    003         赵老五       004         欧阳         家长
5    003           老五       004         欧阳青山     家长
现在就是要做数据清洗,就是先通过group by (用户1编号,用户2编号,用户间关系)
如果存在多条数据,则取(用户1姓名,用户2姓名)长度最大的第一条数据。
这样的需求效果就是:id   用户1编号    用户1姓名     用户2编号   用户2姓名    用户间关系
--------------------------------------------------------------
id  user_num_1 user_name_1 user_num_2 user_name_2 relation_name
1    001         张小三       002         李四         老师
3    003         赵老五       004         欧阳青山     家长请教大家,这样的需求sql怎么写?

解决方案 »

  1.   

    select * 
    from
    (select t.*,rownumber() over(partition by user_num ) rt from tb t)
    where rt=1
      

  2.   

    select *  from 
    (select t.*,row_number() over(partition by user_num order by id) rt from dataTable t) 
    where rt=1
      

  3.   

    try this:with  test as
    (
    select 1 id,'001'  uid1,'张小三' uname1,002 uid2,'李四    ' uname2,'老师' rel from dual union all
    select 2 id,'001'  uid1,'张小  ' uname1,002 uid2,'李四    ' uname2,'老师' rel from dual union all
    select 3 id,'003'  uid1,'赵老五' uname1,004 uid2,'欧阳青山' uname2,'家长' rel from dual union all
    select 4 id,'003'  uid1,'赵老五' uname1,004 uid2,'欧阳    ' uname2,'家长' rel from dual union all
    select 5 id,'003'  uid1,'老五  ' uname1,004 uid2,'欧阳青山' uname2,'家长' rel from dual 
    ) select uid1,max(uname1) name1,uid2,max(uname2) uname2,rel from test group by uid1,uid2,rel
      

  4.   

    select t.id,t.user_num_1,t.user_name_1,t.user_num_2,t.user_name_2,t.relation_name 
      from 
     (select dt.*,row_number() over(partition by user_num_1,user_num_2 
                                       order by length(user_name_1||user_name_2) desc) rn
        from dataTable dt) t
    where rn=1
      

  5.   


    SELECT id , user_num_1, user_name_1 ,user_num_2, user_name_2, relation_name
    FROM 
    (SELECT ROW_NUMBER() OVER(PARTITION BY DN ORDER BY CD DESC) RN,B.* FROM  
    (SELECT DENSE_RANK() OVER(ORDER BY user_num_1) DN,A.LENGTH(user_name_1)+A.LENGTH(user_name_2) CD,A.* FROM dataTable) B)
    WHERE RN=1