PostgreSQL 如何简单实现少量固定行数的行转列操作?
少量行转列最简SQL实现方案
因为你仅需要处理4-5行数据,无需使用复杂的PIVOT语法或者动态SQL,直接按行号匹配取值即可,实现代码非常简洁:
通用兼容写法(支持MySQL 8.0+/PostgreSQL/SQL Server/Oracle等所有支持窗口函数的数据库)
假设你的原始结果集存储在表t中,仅有value一列:
SELECT MAX(CASE WHEN rn = 1 THEN value END) AS tmp, MAX(CASE WHEN rn = 2 THEN value END) AS tmp02, MAX(CASE WHEN rn = 3 THEN value END) AS tmp03 -- 有更多行继续加对应规则即可,最多补充到5行就够用 FROM ( SELECT value, ROW_NUMBER() OVER () AS rn FROM t ) AS t_with_rn
各数据库专属简化写法
PostgreSQL
可以直接用数组聚合取值,代码更短:
SELECT (array_agg(value))[1] AS tmp, (array_agg(value))[2] AS tmp02, (array_agg(value))[3] AS tmp03 FROM t
MySQL
可以用字符串截取的方式实现:
SELECT SUBSTRING_INDEX(GROUP_CONCAT(value ORDER BY value), ',', 1) AS tmp, SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(value ORDER BY value), ',', 2), ',', -1) AS tmp02, SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(value ORDER BY value), ',', 3), ',', -1) AS tmp03 FROM t
SQL Server
可以用LEAD窗口函数简化:
SELECT TOP 1 value tmp, LEAD(value,1) OVER(ORDER BY value) tmp02, LEAD(value,2) OVER(ORDER BY value) tmp03 FROM t
上述所有方案都支持你手动自定义列名,需要扩展行数时只要补充对应行的取值规则即可,完全符合你的轻量需求。
内容的提问来源于stack exchange,提问作者ー PupSoZeyDe ー
相关产品推荐
相关产品推荐

