内容纲要
概要描述
本章主要简单介绍在 inceptor 中如何实现列转行,以供需要时参考。
详细说明
问题:
假如表 test_concat 有如下数据:
id code
1 A
2 B
3 C
1 B
2 C
3 A
1 C
2 A
3 B
想要实现如下所示结果
id code_map
1 A-B-C
2 A-B-C
3 A-B-C
实现:
-- 构造测试数据
CREATE TABLE IF NOT EXISTS test_concat(id INT, code STRING)
CLUSTERED BY (id) INTO 3 BUCKETS
STORED AS ORC_TRANSACTION;
BATCHINSERT INTO test_concat BATCHVALUES (
VALUES (1,'A'), VALUES (2,'B'), VALUES (3,'C'),
VALUES (1,'B'), VALUES (2,'C'), VALUES (3,'A'),
VALUES (1,'C'), VALUES (2,'A'), VALUES (3,'B'));
-
通过 GROUP_CONCAT 实现
SELECT id, GROUP_CONCAT(code,'-') code_map FROM test_concat GROUP BY id ORDER BY id;
-
通过 CONCAT_WS 实现
假设 id 对应的 code 列数据有重复的,如下图
-
列转行时不去重 – COLLECT_LIST
SELECT id, CONCAT_WS('-', COLLECT_LIST(code)) code_map FROM test_concat GROUP BY id ORDER BY id;
-
列转行时去重 – COLLECT_SET
SELECT id, CONCAT_WS('-', COLLECT_SET(code)) code_map FROM test_concat GROUP BY id ORDER BY id;
-
列转行时去重并排序 – SORT_ARRAY
SELECT id, CONCAT_WS('-', SORT_ARRAY(COLLECT_SET(code))) code_map FROM test_concat GROUP BY id ORDER BY id;
-