您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

我期望多行时,Postgres中的交叉表函数返回一行输出

我期望多行时,Postgres中的交叉表函数返回一行输出

查询生成所需的输出

SELECT id, scenario, period, p1, p2, p3, p4  -- all except aux column rn
FROM   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 ,所有输入行都汇总到单个输出行中。

您需要结果中的其他列(scenarioperiod),这些列必须在 row_name之后category 之前。您必须列出period 两次 才能另外获得原始列-看起来似乎很多余。

通常,您会有这样的查询

SELECT id, scenario, p1, p2, p3, p4  -- all except aux column rn
FROM   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   p4
2    1          1    1    1    1
2    2          1    1    1    1
2    3          1    1    1    1

请注意,使用rank()而不是row_number()将相同的组合组合(id, scenario)在一起。 如果计数不是全部,则结果更有意义1

Postgres 2022/1/1 18:46:45 有295人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶