Postgres透视结果没有唯一的标识符进行分组

时间:2018-07-06 00:05:27

标签: postgresql postgresql-9.5

我在查询此查询时遇到了一些麻烦...通常会有一个标识符或一些常用的东西来对数据进行分组,但是在这种特殊情况下,没有任何帮助!

让我说我有一个示例表

<a id=\\"(.*?)\\"><\/a>

看起来像这样

<a>

我想从该表中选择结果,在该表中,我得到以ID的前2个字符为中心的ID列。看起来像这样

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 |

我可能会使用行计数并嵌套在另一个选择中,但是我担心性能,因为实际表已经有几百万条记录,并且此查询中发生了很多其他事情。因此优化是关键

Fiddle to play around with

1 个答案:

答案 0 :(得分:1)

这是一个选项 SQL DEMO

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) |