PostgreSQL中无需多表连接实现表格行转列:contract_kind行转百分位列
PostgreSQL 表透视:无需多表连接实现行转列
当然可以,完全不需要创建多个带WHERE子句的表再连接,以下两种方法都能直接实现需求:
方法一:条件聚合(无需额外扩展)
这是最通用的方式,利用CASE WHEN结合聚合函数将行数据转为列:
SELECT contract_kind, MAX(CASE WHEN percentile = 'p50' THEN value END) AS p50, MAX(CASE WHEN percentile = 'p75' THEN value END) AS p75, MAX(CASE WHEN percentile = 'p90' THEN value END) AS p90, MAX(CASE WHEN percentile = 'p95' THEN value END) AS p95 FROM your_table_name -- 替换为你的实际表名 GROUP BY contract_kind;
原理:通过CASE WHEN筛选出每个百分位对应的数值,再用MAX(或MIN,只要每个contract_kind+percentile组合唯一即可)聚合,将同一合同类型的不同百分位值合并到同一行的不同列。
方法二:使用crosstab函数(适合复杂透视场景)
如果需要处理更多类别或更灵活的透视,可以使用PostgreSQL的crosstab函数,需要先启用tablefunc扩展:
-- 仅需执行一次,启用扩展 CREATE EXTENSION IF NOT EXISTS tablefunc; -- 执行透视查询 SELECT * FROM crosstab( -- 源数据查询:按合同类型和百分位排序 'SELECT contract_kind, percentile, value FROM your_table_name ORDER BY 1, 2', -- 指定要转为列的百分位值 'SELECT DISTINCT percentile FROM your_table_name ORDER BY 1' ) AS ct_result( contract_kind text, p50 numeric, p75 numeric, p90 numeric, p95 numeric );
原理:crosstab函数会自动将源数据中的行类别(percentile)转为列,直接输出透视后的结果,全程无需创建中间表。
内容的提问来源于stack exchange,提问作者Adithya Jayaram
相关产品推荐
相关产品推荐

