BigQuery行转多列:用序号命名列而非商品名
解决方案(BigQuery)
步骤1:为每个交易下的商品添加序号
先通过窗口函数给同一transaction_id下的商品分配递增序号,确保每个商品有唯一的位置标识:
WITH numbered_items AS ( SELECT transaction_id, item_name, ROW_NUMBER() OVER (PARTITION BY transaction_id ORDER BY item_name) AS item_seq FROM `你的项目名.你的数据集名.你的表名` )
步骤2:透视转换为序号命名的列
利用BigQuery的PIVOT功能,将序号对应的商品值转成以item_name_1、item_name_2等命名的列。示例中最多3个商品,直接指定3个序号即可:
SELECT transaction_id, item_name_1, item_name_2, item_name_3 FROM numbered_items PIVOT ( MAX(item_name) AS item_name FOR item_seq IN (1, 2, 3) ) ORDER BY transaction_id;
结果说明
执行上述SQL后,会得到你需要的格式:
| transaction_id | item_name_1 | item_name_2 | item_name_3 |
|---|---|---|---|
| 123 | snacks | marbles | null |
| 124 | pen | tooth_brush | tooth_paste |
如果不需要按item_name排序,可将ORDER BY item_name改为ORDER BY (SELECT NULL),但BigQuery不保证无排序逻辑下的行顺序,建议使用业务上有意义的排序字段。若后续商品数量超过3个,只需在PIVOT的IN子句中添加对应序号(如4、5)即可扩展列数。
内容的提问来源于stack exchange,提问作者Iren Ramadhan
相关产品推荐
相关产品推荐

