Postgresql Postgres pivot结果没有唯一标识符可供分组依据

Postgresql Postgres pivot结果没有唯一标识符可供分组依据,postgresql,postgresql-9.5,Postgresql,Postgresql 9.5,我在旋转此查询时遇到一点问题。。。通常有一个标识符或一些共同的数据分组,但在这个特殊的情况下没有,任何帮助是感激的 假设我有一个这样的样本表 CREATE TABLE test ( id text primary key, created_at date not null default CURRENT_DATE ); INSERT INTO test (id) VALUES ('AS00334455'), ('AS009988'), ('AS0011223'), ('AS00

我在旋转此查询时遇到一点问题。。。通常有一个标识符或一些共同的数据分组,但在这个特殊的情况下没有,任何帮助是感激的

假设我有一个这样的样本表

CREATE TABLE test (
    id text primary key,
    created_at date not null default CURRENT_DATE
);

INSERT INTO test (id) VALUES
('AS00334455'),
('AS009988'),
('AS0011223'),
('AS00908800'),
('PS00555555'),
('PS00333333'),
('PS00444444');
从视觉上看是这样的

|         id | created_at |
|------------|------------|
| AS00334455 | 2018-07-05 |
|   AS009988 | 2018-07-05 |
|  AS0011223 | 2018-07-05 |
| AS00908800 | 2018-07-05 |
| PS00555555 | 2018-07-05 |
| PS00333333 | 2018-07-05 |
| PS00444444 | 2018-07-05 |
|         AS |         PS |
|------------|------------|
| AS00334455 | PS00555555 |
|   AS009988 | PS00333333 |
|  AS0011223 | PS00444444 |
| AS00908800 |            |
我想从这个表中选择结果,在这个表中,我得到了以ID的前两个字符为轴的ID列

|         id | created_at |
|------------|------------|
| AS00334455 | 2018-07-05 |
|   AS009988 | 2018-07-05 |
|  AS0011223 | 2018-07-05 |
| AS00908800 | 2018-07-05 |
| PS00555555 | 2018-07-05 |
| PS00333333 | 2018-07-05 |
| PS00444444 | 2018-07-05 |
|         AS |         PS |
|------------|------------|
| AS00334455 | PS00555555 |
|   AS009988 | PS00333333 |
|  AS0011223 | PS00444444 |
| AS00908800 |            |
到目前为止,我尝试的是这个,但我仍然坚持使用哪一组来适当地呈现结果

SELECT
  MAX(case when t.id_type = 'AS' then t.id else '' end) as AS,
  MAX(case when t.id_type = 'PS' then t.id else '' end) as PS
FROM
(  SELECT LEFT(id, 2) as id_type, id
   FROM test
) as t;
我可能会在另一个select中使用行计数和嵌套,但我担心性能,因为实际的表已经有几百万条记录,并且在这个查询中还发生了很多其他事情。所以优化是关键


这是一个选项:

WITH cte as (
  SELECT ROW_NUMBER() OVER (PARTITION BY LEFT(id, 2) ORDER BY id) as rn,
         LEFT(id, 2) as id_type, id             
  FROM test  
)
SELECT MAX( CASE WHEN id_type = 'AS' THEN id END) as "AS",
       MAX( CASE WHEN id_type = 'PS' THEN id END) as "PS"
FROM cte
GROUP BY rn
ORDER BY rn
;
输出

|         AS |         PS |
|------------|------------|
|  AS0011223 | PS00333333 |
| AS00334455 | PS00444444 |
| AS00908800 | PS00555555 |
|   AS009988 |     (null) |

我远非交叉表方面的专家,但我认为您可以在这里使用它。我不知道演出怎么样。这里有一个非常好的交叉表示例@BShaps谢谢,我已经考虑过交叉表,但问题是你只能透视一段数据,你必须为下一个你想透视的列做一个完整的其他交叉表查询,这看起来并不理想
('AS','PS')
是唯一的类型吗?或者您需要一个动态过滤器?将有4种类型,但它们是固定的/已知的。您可以添加一列以包含该类型吗?我的意思是,这是优化枢轴的最佳方法。否则,我将不得不在运行中创建列,并且不会那么快。谢谢你的回答,我认为这是我可以扩展到我的查询的其余部分的东西(我需要像5列那样旋转)。让我试着把它连接到服务器查询中,看看我能做些什么。