【问题标题】:Join One-To-Many, return minimum greater-than result加入一对多,返回最小大于结果
【发布时间】:2020-06-05 03:01:09
【问题描述】:

我知道标题很复杂,但情况如下:

我有一个这样的用户表:

 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

我想将组加入用户,但只返回比用户的opened_at 日期大于的最小值group_ended_at

换句话说,我想要这个结果:

id           opened_at              group_id              group_ended_at
32o         2/01/2018 00:00:00       29834jb            2/14/2018 00:00:00

我该怎么做?

【问题讨论】:

  • 你遇到了什么错误?

标签: sql postgresql join select nested


【解决方案1】:

我们可以在您的尝试的基础上再接再厉:只需将日期不等条件添加到连接条件中,定义正确的 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

【讨论】:

  • 我正在写这个确切的回复。哈哈
【解决方案2】:

这回答了最初提出的问题。

我喜欢横向连接:

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;

【讨论】:

  • 真的很抱歉,实际上用户和组之间有一个表,称为用户组。我正在尝试推断您的答案以适应这种情况但尚未工作。我已经编辑了我的问题以显示完整的情况,以防您知道如何更改答案以适应它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-01
  • 1970-01-01
  • 2012-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多