如何在Presto中按列名拆分实现列转行并提取前缀为值?
在Presto中通过列名拆分实现宽表转窄表
当然可以实现,你可以通过构造键值对结构并配合unnest展开,再提取列名中的小时部分来完成转换。以下是两种具体的实现方式:
方法一:使用ROW构造数组后展开
SELECT pageurl, -- 从列名中提取小时部分:截取'hourXX_visits'里的XX SUBSTRING(hour_col, 5, 2) AS hour, visits FROM your_table CROSS JOIN UNNEST( ARRAY[ CAST(ROW('hour01_visits', hour01_visits) AS ROW(hour_col VARCHAR, visits INTEGER)), CAST(ROW('hour02_visits', hour02_visits) AS ROW(hour_col VARCHAR, visits INTEGER)) ] ) AS t(hour_col, visits);
方法二:使用Map结构展开
SELECT pageurl, SUBSTRING(map_key, 5, 2) AS hour, map_value AS visits FROM your_table CROSS JOIN UNNEST( map_entries( MAP( ARRAY['hour01_visits', 'hour02_visits'], ARRAY[hour01_visits, hour02_visits] ) ) ) AS t(map_key, map_value);
这两种方法本质都是把每一行的小时列和对应访问量配对成结构,再通过UNNEST拆分成多行,最后用SUBSTRING从列名中提取出小时编号,完美匹配你想要的输出结构。
内容的提问来源于stack exchange,提问作者codenoodles
相关产品推荐
相关产品推荐

