Redshift数据库多列动态Pivot(行转列)实现方案咨询
Redshift多维度行转列SQL实现方案
实现思路
Redshift原生PIVOT语法单次仅支持一个聚合指标计算,要同时输出多指标的行转列结果,更推荐使用条件聚合方案,语法灵活兼容性更强。如果维度组合值会动态变化,可以先查询唯一维度值动态拼接SQL实现。
静态方案(维度组合固定时使用)
直接通过CASE WHEN加聚合函数实现,无需多表关联,性能更优:
SELECT car_id, driver_id, -- 对应salesman=1、tyre_id=9的三个价格指标 MAX(CASE WHEN salesman = 1 AND tyre_id = 9 THEN price_min END) AS s1_t9_price_min, MAX(CASE WHEN salesman = 1 AND tyre_id = 9 THEN price_max END) AS s1_t9_price_max, MAX(CASE WHEN salesman = 1 AND tyre_id = 9 THEN price_avg END) AS s1_t9_price_avg, -- 对应salesman=2、tyre_id=7的三个价格指标 MAX(CASE WHEN salesman = 2 AND tyre_id = 7 THEN price_min END) AS s2_t7_price_min, MAX(CASE WHEN salesman = 2 AND tyre_id = 7 THEN price_max END) AS s2_t7_price_max, MAX(CASE WHEN salesman = 2 AND tyre_id = 7 THEN price_avg END) AS s2_t7_price_avg FROM public.temp_car_id GROUP BY car_id, driver_id ORDER BY driver_id;
动态方案(维度组合动态变化时使用)
如果salesman和tyre_id的组合不固定,可以通过两步实现:
- 先查询所有唯一的维度组合
SELECT DISTINCT salesman, tyre_id FROM public.temp_car_id;
- 遍历查询到的维度组合,按照静态方案的格式拼接对应的CASE WHEN语句片段,嵌入到主查询的SELECT字段部分,执行拼接完成的SQL即可得到动态适配的结果。Redshift环境下可以通过存储过程完成自动拼接执行逻辑。
原有方案问题说明
之前使用的PIVOT语法单次仅支持对price_min一个指标做聚合,如需输出三个指标的结果,需要执行三次PIVOT后通过driver_id关联结果,实现复杂度高于条件聚合方案,因此不推荐。
内容的提问来源于stack exchange,提问作者JSVJ
相关产品推荐
相关产品推荐

