解决此问题的另一种方法是按某种顺序(按字母顺序)分配列。这是扩展数据后的样子(key = 3 添加并扩展为 20 个可能的列)。
CREATE TABLE t1
AS
SELECT 1 AS KEY,'A' AS Value UNION SELECT 1, 'B'
UNION SELECT 2, 'A' UNION SELECT 2, 'B' UNION SELECT 2, 'C' UNION SELECT 2, 'D'
UNION SELECT 3, 'X' UNION SELECT 3, 'Y' UNION SELECT 3, 'Z'
;
select key,
max(decode(rn, 1, value, '-')) as v1,
max(decode(rn, 2, value, '-')) as v2,
max(decode(rn, 3, value, '-')) as v3,
max(decode(rn, 4, value, '-')) as v4,
max(decode(rn, 5, value, '-')) as v5,
max(decode(rn, 6, value, '-')) as v6,
max(decode(rn, 7, value, '-')) as v7,
max(decode(rn, 8, value, '-')) as v8,
max(decode(rn, 9, value, '-')) as v9,
max(decode(rn, 10, value, '-')) as v10,
max(decode(rn, 11, value, '-')) as v11,
max(decode(rn, 12, value, '-')) as v12,
max(decode(rn, 13, value, '-')) as v13,
max(decode(rn, 14, value, '-')) as v14,
max(decode(rn, 15, value, '-')) as v15,
max(decode(rn, 16, value, '-')) as v16,
max(decode(rn, 17, value, '-')) as v17,
max(decode(rn, 18, value, '-')) as v18,
max(decode(rn, 19, value, '-')) as v19,
max(decode(rn, 20, value, '-')) as v20
from (
select key, value, row_number() over (partition by key order by value) as rn
from t1 )
group by key
order by key;
请注意,由于可读性更好,我使用了 DECODE() 语句而不是 CASE。您提到了 Redshift,所以这将在那里工作,但您可能需要恢复到 CASE 以用于其他数据库。
这种方法的结果如下所示:
key v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 v20
1 A B - - - - - - - - - - - - - - - - - -
2 A B C D - - - - - - - - - - - - - - - -
3 X Y Z - - - - - - - - - - - - - - - - -