我知道标题很复杂,但情况如下:
我有一张这样的用户表:
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
我想加入用户的组,但只返回最小group_ended_at
,该值大于用户的opened_at
日期。
换句话说,我想要这个结果:
id opened_at group_id group_ended_at
32o 2/01/2018 00:00:00 29834jb 2/14/2018 00:00:00
我该怎么做?
我们可以在您的尝试基础上进行构建:只需将日期不等式条件添加到联接条件中,定义适当的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
这回答了最初提出的问题。
我喜欢这个的横向连接:
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;