具有下表(conversations
):
id | record_id | is_response | text |
---+------------+---------------+----------------------+
1 | 1 | false | in text 1 |
2 | 1 | true | response text 3 |
3 | 1 | false | in text 2 |
4 | 1 | true | response text 2 |
5 | 1 | true | response text 3 |
6 | 2 | false | in text 1 |
7 | 2 | true | response text 1 |
8 | 2 | false | in text 2 |
9 | 2 | true | response text 3 |
10 | 2 | true | response text 4 |
另一个帮助表(responses
):
id | text |
---+----------------------+
1 | response text 1 |
2 | response text 2 |
3 | response text 4 |
我正在寻找一个SQL查询来输出以下内容:
record_id | context
----------+-----------------------+---------------------
1 | in text 1 response text 3 in text 2 response text 2
----------+-----------------------+---------------------
2 | in text 1 response text 1
----------+-----------------------+---------------------
2 | in text 2 response text 3 response text 4
所以,每一次is_response
是true
和text
是 在 响应表, 汇总
对话上下文到这一点,忽略不池中的响应结束谈话的一部分。
在上面的示例中,活动 响应文本 为record_id
1中的 3 。
我尝试了以下复杂的SQL,但有时会中断将文本汇总错误的情况:
with context as(
with answers as (
SELECT record_id, is_response, id as ans_id
, max(id)
OVER (PARTITION BY record_id ORDER BY id
ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS previous_ans_id
FROM (select * from conversations where text in (select text from responses)) ans
),
lines as (
select answers.record_id, con.id, COALESCE(previous_ans_id || ',' || ans_id, '0') as block, con.text as text from answers, conversations con where con.engagement_id = answers.record_id and ((previous_ans_id is null and con.id <= ans_id) OR (con.id > previous_ans_id and con.id <= ans_id)) order by engagement_id, id asc
)
select record_id, block,replace(trim(both ' ' from string_agg(text, E' ')) ,' ',' ') ctx from lines group by record_id, block order by record_id,block
)
select * from context
我敢肯定有更好的方法。
这是我的看法:
SELECT
record_id,
string_agg(text, ' ' ORDER BY id) AS context
FROM (
SELECT
*,
coalesce(sum(incl::integer) OVER (ORDER BY id ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING),0) AS grp
FROM (
SELECT *, is_response AND text IN (SELECT text FROM responses) as incl
FROM conversations
) c
) c1
GROUP BY record_id, grp
HAVING bool_or(incl)
ORDER BY max(id);
这将扫描表conversations
一次,但是我不确定它的性能是否会比您的解决方案更好。基本思想是使用窗口函数来计算同一记录中的前几行如何结束对话。然后,我们可以使用该数字进行分组,record_id
并丢弃不完整的对话。
问题内容: 我想创建两个下拉列表,类别和项目。 如果我选择名为car的类别之一,则项目下拉列表应包含Honda,Volvo和Nissan。 如果我选择一个名为phone的类别,则项目下拉列表应具有此iPhone,Samsung,Nokia。 我怎样才能做到这一点?我知道我无法使用纯HTML做到这一点。 问题答案: 工作演示 (带有jquery) 更新 :使用eval()能够添加所需的任意数量的数组
问题内容: 我在尝试制作自己的内容时遇到了麻烦,具体取决于其他方面的选择值。第一个的内容来自我的数据库中的一个表,并且运行良好,但是第二个的内容应该来自另一个表,但是我无法使其工作。这是我的,我只是在尝试证明其工作原理: 这是我的Bean部分,应该获取第二个菜单的内容: 我已经为此工作了好几个小时,但还是一无所获,我真的很着急,如果能在这里给我一些帮助,我将不胜感激。非常感谢您:D 问题答案: i
问题内容: 假设我有这张桌子(小提琴可用)。 我按行对行进行分组,对于每个组,我都希望从column中获得一个值。但是,我不需要 任何 值,但是我想从具有maximal的行中获取值,并从所有这些中获取具有maximal的值。换句话说,我的结果应该是 当前解决方案 我知道一个查询来实现这一点: 题 但是我认为这个查询 很难看 。主要是因为它使用了一个 依赖的子查询 ,感觉就像是真正的性能杀手。因
本文向大家介绍根据MySQL中其他两个列的值来匹配列的值,包括了根据MySQL中其他两个列的值来匹配列的值的使用技巧和注意事项,需要的朋友参考一下 让我们首先创建一个表- 使用插入命令在表中插入一些记录- 使用select语句显示表中的所有记录- 这将产生以下输出- 以下是根据ID和MatchID显示FirstName的查询- 这将产生以下输出-
我想选择数据表()的特定行值(此处),其中过滤条件位于其他数据表()中。它不是一个精确的过滤器,因为如果我在中有值3,我在中就有这个值的最小值和最大值变量。此外,我有一个字符串,其中包含特定的模式。例如: 中的 和 中的相应行包含 , 和 ,即 。 我在寻找这个值所在的范围和最大目标值的直线。 我有以下简化的例子: 看起来像这样: 我包括<code>大小 到目前为止,我的解决方案如下: 我写了一个
我有一个表,它有4列()gender具有与每个客户链接的唯一值:、或。 该部门与每种产品(男性或女性)都有独特的价值 我做了一个复杂的过程。首先,使用客户信息将male和其他客户分开(创建了两个表CUST_MALEY和cust_other) 如果CUST_MALEY表中有客户,则使用join,返回men division products行(其中division='men');如果cust_oth