此查询生成所需的输出:
SELECt id, scenario, period, p1, p2, p3, p4 -- all except aux column rnFROM crosstab( 'SELECt row_number() OVER (ORDER BY id, scenario, period)::int AS rn , id, scenario, period, period, ct FROM m ORDER BY 1', 'VALUES (1), (2), (3), (4)' ) AS (rn int, id int, scenario int, period int, p1 int, p2 int, p3 int, p4 int);
两个特殊的困难:
您还没有 row_name的 唯一列。我
row_number()
用来生成代理密钥:rn
。我从外部将其删除,SELECt
以符合您期望的结果。
您尝试的方式id
被视为 row_name ,所有输入行都汇总到单个输出行中。您需要结果中的其他列(
scenario
和period
),这些列必须在 row_name之后 和 category 之前。您必须列出period
两次 才能另外获得原始列-看起来似乎很多余。
基本:
- PostgreSQL交叉表查询
与此特定情况有关:
- 使用Tablefunc在多个列上枢轴
通常,您会有这样的查询:
SELECT id, scenario, p1, p2, p3, p4 -- all except aux column rnFROM crosstab( 'SELECt rank() OVER (ORDER BY id, scenario)::int AS rn , id, scenario, period, ct FROM m ORDER BY 1', 'VALUES (1), (2), (3), (4)' ) AS (rn int, id int, scenario int, p1 int, p2 int, p3 int, p4 int);
输出如下:
id scenario p1 p2 p3 p42 1 1 1 1 12 2 1 1 1 12 3 1 1 1 1
请注意,使用
rank()而不是
row_number()将相同的组合组合
(id, scenario)在一起。
如果计数不是全部,则结果更有意义
1。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)