Sql 联接一对多,返回的最小值大于结果
我知道标题很复杂,但情况如下: 我有这样一个用户表:Sql 联接一对多,返回的最小值大于结果,sql,postgresql,join,select,nested,Sql,Postgresql,Join,Select,Nested,我知道标题很复杂,但情况如下: 我有这样一个用户表: id opened_at 32o 2/01/2018 00:00:00 user_id group_id 32o 29834jb group_id group_ended_at 29834jb 1/14/2018 00:00:00 29834jb 2/14/2
id opened_at
32o 2/01/2018 00:00:00
user_id group_id
32o 29834jb
group_id group_ended_at
29834jb 1/14/2018 00:00:00
29834jb 2/14/2018 00:00:00
29834jb 3/14/2018 00:00:00
29834jb 4/14/2018 00:00:00
还有一个用户组表,如下所示:
id opened_at
32o 2/01/2018 00:00:00
user_id group_id
32o 29834jb
group_id group_ended_at
29834jb 1/14/2018 00:00:00
29834jb 2/14/2018 00:00:00
29834jb 3/14/2018 00:00:00
29834jb 4/14/2018 00:00:00
还有一个完整的分组表,如下所示:
id opened_at
32o 2/01/2018 00:00:00
user_id group_id
32o 29834jb
group_id group_ended_at
29834jb 1/14/2018 00:00:00
29834jb 2/14/2018 00:00:00
29834jb 3/14/2018 00:00:00
29834jb 4/14/2018 00:00:00
我想将组加入到用户中,但只返回在结束的组的最小值,该值大于用户在日期打开的组的最小值
换句话说,我想要这个结果:
id opened_at group_id group_ended_at
32o 2/01/2018 00:00:00 29834jb 2/14/2018 00:00:00
我该怎么做呢?这回答了最初提出的问题 我喜欢横向连接:
SELECT u.*, g.group_ended_at
FROM users u LEFT JOIN LATERAL
(SELECT MIN(g.group_ended_at) as group_ended_at
FROM groups g
WHERE u.group_id = g.group_id AND g.group_ended_at > u.opened_at
) g;
我们可以利用您的尝试:只需将日期不平等条件添加到连接条件中,定义适当的
group by
子句,您就可以:
SELECT u.id, u.opened_at, u.group_id, MIN(g.group_ended_at)
FROM users u
LEFT JOIN groups g
ON u.group_id = g.group_id
AND g.group_ended_at > u.opened_at
GROUP BY u.id, u.opened_at, u.group_id
你得到了什么错误?我正处于写作过程中。哈哈,真的很抱歉,实际上在用户和组之间有一个表,叫做用户组。我试图推断出你的答案在那种情况下有效,但还不起作用。我已经编辑了我的问题,以显示全部情况,以防你知道如何更改答案以适应它