基于Presto SQL实现特定格式数据透视的技术咨询
解决方案
要实现你需要的透视效果,需要修正两个核心问题:一是你的CASE语句引用了错误字段(应该用Status而非title),二是必须配合聚合函数和分组来将同一功能的多行记录合并为一行。另外,要实现Feature_Area不重复显示,可以通过窗口函数标记行号来控制显示逻辑。
完整SQL代码
SELECT -- 仅在同一Feature_Area的第一行显示区域名称,其余行留空 CASE WHEN rn = 1 THEN Feature_Area ELSE '' END AS Feature_Area, Feature, -- 透视生成各App列,用MAX提取对应状态 MAX(CASE WHEN Product = 'App1' THEN Status END) AS App1, MAX(CASE WHEN Product = 'App2' THEN Status END) AS App2, MAX(CASE WHEN Product = 'App3' THEN Status END) AS App3 FROM ( -- 给同一Feature_Area下的行添加编号 SELECT Feature_Area, Feature, Product, Status, ROW_NUMBER() OVER (PARTITION BY Feature_Area ORDER BY Feature) AS rn FROM your_table_name -- 替换为你的实际表名 ) t GROUP BY Feature_Area, Feature, rn ORDER BY Feature_Area, Feature;
代码说明
- 子查询添加行号:用
ROW_NUMBER()窗口函数按Feature_Area分组、Feature排序,给每组内的行分配序号,用于控制Feature_Area的显示时机。 - 透视列生成:用
MAX()聚合函数包裹CASE语句,因为同一Feature+Product组合只有一条状态记录,MAX会自动过滤NULL值,得到对应App的状态。 - 分组与排序:按
Feature_Area、Feature和行号分组,确保每个功能单独一行,最后按区域和功能排序保证结果整洁。
执行结果
| Feature_Area | Feature | App1 | App2 | App3 |
|---|---|---|---|---|
| User experience | Sign Up | Green | Red | NULL |
| Log off | Green | Red | NULL | |
| Back End | Delete User | NULL | NULL | Red |
| Update User | NULL | NULL | Green |
内容的提问来源于stack exchange,提问作者Bobby Dore
相关产品推荐
相关产品推荐

