Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 联接一对多,返回的最小值大于结果_Sql_Postgresql_Join_Select_Nested - Fatal编程技术网

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

你得到了什么错误?我正处于写作过程中。哈哈,真的很抱歉,实际上在用户和组之间有一个表,叫做用户组。我试图推断出你的答案在那种情况下有效,但还不起作用。我已经编辑了我的问题,以显示全部情况,以防你知道如何更改答案以适应它