我需要在表服务中转动列servicename,然后合并值。
services:
userid servicename
1 A
2 B
2 C
3 B
1 C
4
5 C
我正在尝试的查询是
SELECT userid,
COALESCE(a,b,c) AS servicename
FROM (SELECT userid,
concat_ws('',a) AS a,
concat_ws('',b) AS b,
concat_ws('',c) AS c
FROM (SELECT userid,
collect_list(a.group_map['A']) AS a,
collect_list(a.group_map['B']) AS b,
collect_list(a.group_map['C']) AS c
FROM (SELECT userid,
MAP(servicename,servicename) AS group_map
FROM (SELECT userid, servicename, servicename FROM services) AS table1) AS table2) AS table3) AS table4
以下是每个SELECT
查询的细分结果:
查询1:
SELECT userid,
servicename,
servicename
FROM services
结果1:
userid servicename servicename
1 A A
2 B B
2 C C
3 B B
1 C C
4
5 C C
查询2:
SELECT userid,
MAP(servicename,servicename) AS group_map
FROM table1
结果2:
userid group_map
1 {"A":"A"}
2 {"B":"B"}
2 {"C":"C"}
3 {"B":"B"}
1 {"C":"C"}
4 {"null":"null"}
5 {"C":"C"}
查询3:
SELECT userid,
collect_list(a.group_map['A']) AS a,
collect_list(a.group_map['B']) AS b,
collect_list(a.group_map['C']) AS c
FROM table2
结果3:
userid a b c
1 ["A"] ["C"]
2 ["B"] ["C"]
3 ["B"]
4
5 ["C"]
以下concat_ws函数是将数组转换为String
查询4:
SELECT userid,
concat_ws('',a) AS a,
concat_ws('',b) AS b,
concat_ws('',c) AS c
FROM table3
结果4:
userid a b c
1 A C
2 B C
3 B
4
5 C
最后在查询中使用COALESCE函数得到如下结果:
查询5
SELECT userid,
COALESCE(a,b,c) AS servicename
FROM table4
以下是我希望看到的结果
结果5:
userid servicename
1 A
2 B
3 B
4
5 C
但是,我只获得Service A
或null,如下所示:
userid servicename
1 A
2
3
4
5
有人怀疑有任何问题吗?需要铸造吗?
我一直在尝试不同的东西,并尝试在网上搜索,但还没有运气。
提前致谢!
答案 0 :(得分:1)
看起来你只想要每个id的1个服务名称
select * from
(
select userid,servicename,row_number() over (partition by userid order by servicename) as row_no
) res
where res.row_no = 1
这应该可以帮到你
userid servicename
1 A
2 B
3 B
4
5 C
如果您尝试为每个用户标识转移服务名称
select userid, collect_set(servicename)
from table
group by userid;
这应该可以帮到你
userid servicename
1 A,C
2 B,C
3 B
4
5 C