比如我有这样的一张表 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怎么写?
--------------------------------------------------------------
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怎么写?
from
(select t.*,rownumber() over(partition by user_num ) rt from tb t)
where rt=1
(select t.*,row_number() over(partition by user_num order by id) rt from dataTable t)
where rt=1
(
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
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
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