将结果减少到累积的组中

Posted

技术标签:

【中文标题】将结果减少到累积的组中【英文标题】:Reduce results into accumulated groups 【发布时间】:2016-08-31 11:36:29 【问题描述】:

有下表(描述对话):

 id | record_id  |  is_response  |         text         |
 ---+------------+---------------+----------------------+
 1  |     1      |      false    | first line of text   |
 2  |     1      |      true     | second line of text  |
 3  |     1      |      false    | third line of text   |
 4  |     1      |      true     | fourth line of text  |
 5  |     1      |      true     | fifth line of text   |
 6  |     2      |      false    | first line of text   |
 7  |     2      |      true     | second line of text  |
 8  |     2      |      false    | third line of text   |
 9  |     2      |      true     | fourth line of text  |
 10 |     2      |      true     | fifth line of text   |

我正在寻找一个 SQL 查询来输出以下内容:

  record_id |       in_text         |         out_text
  ----------+-----------------------+---------------------
       1    | first line of text    | second line of text
  ----------+-----------------------+---------------------
       1    | first line of text    | 
            | second line of text   | 
            | third line of text    | fourth line of text
  ----------+-----------------------+---------------------
       1    | first line of text    |  
            | second line of text   | 
            | third line of text    | 
            | fourth line of text   | fifth line of text
  ----------+-----------------------+---------------------
       2    | first line of text    | second line of text
  ----------+-----------------------+---------------------
       2    | first line of text    | 
            | second line of text   | 
            | third line of text    | fourth line of text
  ----------+-----------------------+---------------------
       2    | first line of text    | 
            | second line of text   | 
            | third line of text    | 
            | fourth line of text   | fifth line of text

意思是每次is_response 列是true 将文本列累积为in_text 并将新行添加为out_text

行的顺序由id定义。

是否可以使用纯 SQL?怎么样?

【问题讨论】:

但是,由于id 不是唯一的,必须还有另一个关键元素... 您似乎假设行的自然顺序,这在关系数据库表中不存在。您需要某种方式来对行进行排序,Postgres 不知道“第一行文本”应该排在第一位。 解决方案重要吗?如果是这样,我会将 id 更改为 record_id 并添加另一列 请检查我的编辑(添加了主列) 是的:这很重要(不仅仅是解决方案)没有候选键的表基本上是没用的。 【参考方案1】:

在子查询中使用聚合函数string_agg()作为窗口函数:

SELECT record_id, in_text, out_text  
FROM  (
   SELECT record_id, text AS out_text, is_response
        , string_agg(text, E'\n')
          OVER (PARTITION BY record_id ORDER BY id
                ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS in_text
   FROM   tbl
   ) sub
WHERE  is_response;

这里的特殊功能是使用ROWS 子句调整窗口框架。相关:

Grouping based on sequence of rows

SQL Fiddle.(sqlfiddle 中换行转换为空格)

【讨论】:

像魅力一样工作:) 能否请您看看***.com/questions/39577026/… 答案几乎是完整的,但无法汇总单个响应,tahnks :)

以上是关于将结果减少到累积的组中的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Oracle 的组中获得第三个 [重复]

iOS Game Center 将排行榜和成就移动到 2 个游戏的组中

Drupal Group模块,以编程方式将用户添加到具有特定角色的组中

如果它出现在MYSQL中的组中,如何为每个值返回'true / false'?

SQL Server 查找包含的组

sql语句,求出现次数最多的组中,出现次数最多的一条数据