【问题标题】:Concat rows in PostgresPostgres 中的连接行
【发布时间】:2012-09-11 12:47:11
【问题描述】:

Given 是这样的 Postgres 表

nummer  vorname    name        cash
------|-----------|-----------|-----
1       paul       smith       500
2       andy       london      700
2       mike       dover       700
3       clara      winchester  200

要查询这个表,我的 sql 看起来是这样的:

SELECT 
  nummer,
  vorname,
  name,  
  cash as total
FROM 
  data.myTable
GROUP BY
  nummer, 
  name,
  vorname,
  cash
ORDER BY
  nummer; 

是否可以连接nummer 相同的两行(在本例中为2)。 意味着我的输出应该是这样的(如果数字相等,现金也将具有相同的值):

nummer  vorname    name        cash
------|-----------|-----------|-----
1       paul       smith       500
2       andy       london      700
        mike       dover       
3       clara      winchester  200

【问题讨论】:

    标签: postgresql aggregate-functions concat


    【解决方案1】:

    使用GROUP BY 和聚合函数string_agg()

    SELECT nummer
          ,string_agg(vorname, E'\n') AS vorname
          ,string_agg(name, E'\n') AS name
          ,cash
    FROM   mytable
    GROUP  BY nummer, cash
    ORDER  BY nummer, cash;
    

    我将cash 添加到GROUP BY 以获取原始值并防止出现相同nummer 不同的情况。

    至于你的评论:

    是否也可以通过名称来唯一化查询。表示如果 2|andy london|700 被列出两次,一个应该被删除。

    SELECT nummer
          ,string_agg(vorname, E'\n') AS vorname
          ,string_agg(name, E'\n') AS name
          ,cash
    FROM  (
       SELECT DISTINCT
              nummer, vorname, name, cash
       FROM   mytable
       ) AS m
    GROUP  BY nummer, cash
    ORDER  BY nummer, cash;
    

    【讨论】:

    • @tBook:请注意,我从聚合函数中删除了DISTINCT。是一个疏忽。您可以使用它来删除每列的重复项(您没有指定)。
    【解决方案2】:
    SELECT nummer, 
           array_to_string(array_agg(vorname), E'\n'), 
           array_to_string(array_agg(name), E'\n'),
           cash
      FROM mytable
      group by nummer, cash;
    

    应该可以的。

    【讨论】:

    • 感谢一百万这很好,我又发现了一个问题。是否可以通过名称来唯一化查询。表示如果 2|andy london|700 被列出两次,则应删除一个。 -> 换句话说,我如何在名称、vorname、现金上添加不同的名称?谢谢托尼
    • 修复了它。至于摆脱重复的名字,这是一个艰难的过程。你在这里有一些关于数据依赖的问题。在这一边工作。一秒。
    • @Chris,感谢您的意见。 “group by”中的现金是一个很好的步骤,这很有效。关于名字。在这种情况下,它应该看起来像我第一篇文章中的第二个代码示例。到目前为止,这有效,除了重复的名称。换句话说,在这些情况下,nummer 和 cash 总是相同的。 nummer 和 cash 应该合并(工作!),名称应该合并,重复的应该被踢出。可能的?我的另一个想法是将所有数据保存在一个 php 数组中并执行类似数组唯一的操作……亲切的问候,托尼
    • @Chris:通过 erwins sn-p 的小改编得到它,我会发布它,但不确定如何在 stackoverflow 上正确执行。非常感谢你们!
    猜你喜欢
    • 2017-01-23
    • 2018-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-31
    • 2017-07-31
    相关资源
    最近更新 更多