将结果减少到累积的组中
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
子句调整窗口框架。相关:
SQL Fiddle.(sqlfiddle 中换行转换为空格)
【讨论】:
像魅力一样工作:) 能否请您看看***.com/questions/39577026/… 答案几乎是完整的,但无法汇总单个响应,tahnks :)以上是关于将结果减少到累积的组中的主要内容,如果未能解决你的问题,请参考以下文章
iOS Game Center 将排行榜和成就移动到 2 个游戏的组中
Drupal Group模块,以编程方式将用户添加到具有特定角色的组中