Postgresql - 按字符串的第二部分用连字符和组拆分字符串

时间:2017-08-01 06:43:47

标签: postgresql

我将数据存储在以下格式中:

   resource_name      |    readiops   | writeiops  
     90832-00:29:3E        3.21           4.00
     90833-00:30:3E        2.12           3.45
     90834-00:31:3E        2.33           2.78
     90832-00:29:3E        4.21           6.00

我希望能够通过" - "对 resource_name 列进行拆分。并按分割的第二部分对其进行分组,以便上述数据如下所示:

      array_serial         |      ldev        |  readiops    |   writeiops  
       90832                    00:29:3E         3.21,4.21        4.00,6.00
       90833                    00:30:3E         2.12             3.45 
       90834                    00:31:3E         2.33             2.78

resource_name被拆分为array_serial& ldev。

我尝试使用以下查询只是为了得到错误。

SELECT 
    SUBSTRING(resource_name, 0, STRPOS(resource_name, ':')) AS array_serial,
    SUBSTRING(resource_name,1, STRPOS(resource_name, ':')) AS ldev 
FROM table 
GROUP BY SUBSTRING(resource_name, 0, STRPOS(resource_name, ':'))

我是postgres的新手。亲切的帮助。

1 个答案:

答案 0 :(得分:2)

使用split_part()

with my_table(resource_name, readiops, writeiops) as (
values
('90832-00:29:3E', 3.21, 4.00),
('90833-00:30:3E', 2.12, 3.45),
('90834-00:31:3E', 2.33, 2.78),
('90832-00:29:3E', 4.21, 6.00)
)

select 
    split_part(resource_name::text, '-', 1) as array_serial,
    split_part(resource_name::text, '-', 2) as ldev,
    string_agg(readiops::text, ',') as readiops,
    string_agg(writeiops::text, ',') as writeiops
from my_table
group by 1, 2;

 array_serial |   ldev   | readiops  | writeiops 
--------------+----------+-----------+-----------
 90832        | 00:29:3E | 3.21,4.21 | 4.00,6.00
 90833        | 00:30:3E | 2.12      | 3.45
 90834        | 00:31:3E | 2.33      | 2.78
(3 rows)