select m.city_id as city_code
,m.class_id as ct_class_id
,regexp_replace(concat_ws(',',sort_array(collect_set(concat_ws(':',cast(row_id as string),tea_id)))),'\\d+\:','')as tea_ids
,regexp_replace(concat_ws(',',sort_array(collect_set(concat_ws(':',cast(row_id as string),tea_teacher_name)))),'\\d+\:','')as tea_teacher_names
from(select tct.city_id
,tct.class_id
,tet.tea_id
,tet.tea_teacher_name
,tet.tea_emp_no
,tet.tea_teacher_code
,row_number()over(partitionby tct.city_id,tct.class_id orderby nvl(tet.tea_emp_no,tet.tea_teacher_code)*1)as row_id
from class_teacher tct
innerjoin teacher tet
on tct.city_id=tet.city_id
and tct.teacher_id=tet.tea_id
) m
groupby m.city_id
,m.class_id
;
有朋友问为什么*1
随手写了个临时表,大家一眼就能看出来为什么了~
这里的序号生成方式要结合业务具体分析~
droptableifexists bi_temp.hzy_20220825;createtable bi_temp.hzy_20220825 asselect'1'as a
unionallselect'2'as a
unionallselect'3'as a
unionallselect'11'as a
unionallselect'22'as a
unionallselect'33'as a
;select*,dense_rank()over(orderby a)as rank
from bi_temp.hzy_20220825
;
a rank
111122322435336select*,dense_rank()over(orderby a*1)as rank
from bi_temp.hzy_20220825
;
a rank
112233114225336
有朋友说要 用 lapd 左补足
具体还是要看你的业务场景,左补足也行
lpad(row_number() over (partition by tct.city_id,tct.class_id order by nvl(tet.tea_emp_no,tet.tea_teacher_code)*1) ,10,‘0’) as row_id