【问题标题】:Postgresql - Split a string by hyphen and group by the second part of the stringPostgresql - 按连字符拆分字符串并按字符串的第二部分分组
【发布时间】:2018-01-07 21:35:52
【问题描述】:

我有以下格式存储的数据:

   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 的新手。所以请帮忙。

【问题讨论】:

    标签: postgresql


    【解决方案1】:

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

    【讨论】:

    • 魔术。为什么查询需要 60-70 秒才能在具有 50,000 条记录的表中执行?
    • 我真的不知道。我已经在一个有 50000 行随机行的表上进行了测试,得到的时间
    • 它应该运行得更快,用 500k 记录测试,这个查询在一个普通的服务器上执行大约 2600 毫秒。你用的是什么版本的 postgresql?
    • 我的 postgres 版本是 9.3.14。也许因为我的数据库连接是远程的,我正在使用工具 db 可视化工具来执行查询?即使我将其限制为 50 或 100,执行时间也会超过 50 秒。奇怪
    • @user1411837 - 当然,在远程服务器上,大型结果集的传输时间可能比执行时间长很多倍。尝试限制结果并使用简单的终端 psql。
    猜你喜欢
    • 2015-07-25
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多