我在查询此查询时遇到了一些麻烦...通常会有一个标识符或一些常用的东西来对数据进行分组,但是在这种特殊情况下,没有任何帮助!
让我说我有一个示例表
<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 |
我可能会使用行计数并嵌套在另一个选择中,但是我担心性能,因为实际表已经有几百万条记录,并且此查询中发生了很多其他事情。因此优化是关键
答案 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) |