【问题标题】:Perl + PostgreSQL-- Selective Column to Row TransposePerl + PostgreSQL-- 选择性列到行转置
【发布时间】:2012-01-23 17:15:25
【问题描述】:

我正在尝试寻找一种方法来使用 Perl 来进一步处理 PostgreSQL 输出。如果有更好的方法通过 PostgreSQL 做到这一点,请告诉我。我基本上需要在文件中选择某些列(实时、值)来连接某些列以创建一行,同时保留 ID 和 CAT。

第一次发帖,如有遗漏请告知。

输入:

ID  CAT   Realtime  Value
A   1    time1       55
A   1    time2       57
B   1    time3       75
C   2    time4       60
C   3    time5       66
C   3    time6       67

输出:

ID  CAT  Time                   Values
A   1    time 1,time2           55,57
B   1    time3                  75
C   2    time4                  60
C   3    time5,time6            66,67

【问题讨论】:

    标签: perl postgresql


    【解决方案1】:

    你可以像这样在 Postgres 中最简单地做到这一点(使用数组列)

    CREATE TEMP TABLE output AS SELECT
      id, cat, ARRAY_AGG(realtime) as time, ARRAY_AGG(value) as values
      FROM input GROUP BY id, cat;
    

    然后从输出表中选择您想要的任何内容。

    【讨论】:

    • 谢谢,由于实时和值是非字符串字段,这很好地修复了它,没有错误。
    【解决方案2】:
    SELECT id
         , cat
         , string_agg(realtime, ',') AS realtimes
         , string_agg(value, ',') AS values
    FROM   input
    GROUP  BY 1, 2
    ORDER  BY 1, 2;
    

    string_agg() 需要 PostgreSQL 9.0 或更高版本,并将所有值连接到一个分隔符分隔的字符串 - 而array_agg() (v8.4+) 从输入值创建 am 数组。


    关于1, 2——我在SELECT命令上引用了手册:

    GROUP BY clause

    表达式可以是输入列名,也可以是名称或序数 输出列(SELECT 列表项),或 ...

    ORDER BY clause

    每个表达式可以是输出列的名称或序数 (选择列表项),或

    强调我的。所以这只是符号上的方便。对于SELECT 列表中的复杂表达式特别方便。

    【讨论】:

    • 1, 2 代表当前选择中的“第 1 列和第 2 列”? Tnx
    • 谢谢!当我意识到部分问题是需要升级时,我升级到了 9.1。我继承的系统有8.3。词很精彩。
    • @CornelGhiban:我在回答中添加了一些关于1, 2 的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-21
    • 2012-05-31
    • 2017-09-18
    • 2012-12-14
    • 2021-09-12
    • 1970-01-01
    相关资源
    最近更新 更多