当前位置: 首页 > 面试题库 >

PostgreSQL:如何合并多行?

柴瀚
2023-03-14
问题内容

我有一个这样的表来保存体检的结果以及发送报告的日期和结果。实际上,发送的日期是基于临床访问日期。客户可以拥有一个或多个报告(日期可能有所不同)

---------------------------------------
|  client_id  |  date_sent  | result |
---------------------------------------
| 1           |   2001      |    A   |
| 1           |   2002      |    B   |
| 2           |   2002      |    D   |
| 3           |   2001      |    A   |
| 3           |   2003      |    C   |
| 3           |   2005      |    E   |
| 4           |   2002      |    D   |
| 4           |   2004      |    E   |
| 5           |   2004      |    B   |
---------------------------------------

我想从上述数据中提取以下报告。

---------------------------------------------------
|  client_id  |  result1  |  result2  |   resut3  |
---------------------------------------------------
|      1      |    A      |    B      |           |
|      2      |    D      |           |           |
|      3      |    A      |    C      |     E     |
|      4      |    D      |    E      |           |
|      5      |    B      |           |           |
---------------------------------------------------

我正在研究Postgresql。“交叉表”功能在这里无法使用,因为每个客户端的“ date_sent”不一致。

任何人都可以粗略地提出一个应如何查询的想法吗?


问题答案:

我建议采用以下方法:

SELECT client_id, array_agg(result) AS results
    FROM labresults
    GROUP BY client_id;

它的输出格式不完全相同,但是它将为您提供更快,更干净的相同信息。

如果要将结果放在单独的列中,则始终可以执行以下操作:

SELECT client_id,
       results[1] AS result1,
       results[2] AS result2,
       results[3] AS result3
FROM
(
    SELECT client_id, array_agg(result) AS results
        FROM labresults
        GROUP BY client_id 
) AS r
ORDER BY client_id;

尽管这显然会引入可能结果的硬编码数量。



 类似资料:
  • 我有一个表,在列中包含以下值: 表(col1, col2, col3, col4, col5, col6): 因此,我希望有一行: 怎么做?

  • 问题内容: 这个问题的标题不准确,但我不知道如何总结。如果可以的话,请随时重新编写! 这是两个表的摘录: 桌子 桌子 我需要合并这些表以获得此输出: 我找不到正确的查询。我需要下面类似的内容(我知道它不能完成工作),但是如何将所有代码和年份合并到一个表中,因为代码和年份在两个表中都没有重复… 以下是用于快速创建上述表的SQL脚本: 问题答案: 宇很可能是在寻找对

  • 问题内容: 这个问题已经在这里有了答案 : 9年前关闭。 可能的重复项: 在MS SQL Server 2005中模拟group_concat MySQL函数? SQL Server中的Concat组 我正在尝试编写将行合并在一起的SQL查询。我需要它通过ID#将未指定数量的行组合在一起,但将它们的地址连接起来,例如说成一个单元格。 说我们有 我想得到 每个ID的地址数量可以变化。一些ID具有1,

  • 问题内容: 我有这样一张桌子: 而且我想选择连续的合并行。假设我有(简化)的资料,例如: 我想知道是否可以选择格式如下的行: 编辑: 这是SQLfiddle 我正在使用9.3版的Postgresql! 谢谢! 问题答案: 这是解决此问题的一种方法。创建确定是否一个纪录做了标志 不 重叠的前一个。这是一个小组的开始。然后取该标志的累积总和并将其用于分组: 这是一个SQL Fiddle。

  • 问题内容: 如何将其写成一行? 用id和class选择html标签的方法是什么? 问题答案: 您所要做的就是用逗号分隔它们,例如

  • 问题内容: 使用运算符将产生以下结果: 我希望能够实现以下结果(对于操作员来说只是一个占位符): 因此,您可以看到顶级键的子值已“合并”,使得结果包含和。 如何在Postgres中“深度”合并两个 JSONB 值? 如果可能的话,这可能吗? 一个更复杂的测试用例: 原始“合并”并成为对象的另一个测试用例: 问题答案: 您应该合并两个值都使用的未嵌套元素。在不平凡的查询中执行此操作可能会感到不舒服,