SQL仅在最早的日期连接两个表

SQL仅在最早的日期连接两个表,sql,date,join,Sql,Date,Join,我不擅长SQL,而且很难理解其他答案 我的要求类似于这两个:和 我有以下两个表格: T1 T2 我想加入这些表,以这样一种方式,每个锁定时间只与第一个解锁时间配对,这比加入的锁定时间大。因此,生成的示例表为: user | lock_time | unlock_time ------------------------------------- a | 2016-11-03 04:53:57 | 2016-11-04 05:47:51 b | 2016-11-14 00:50:38 |

我不擅长SQL,而且很难理解其他答案

我的要求类似于这两个:和

我有以下两个表格:

T1

T2

我想加入这些表,以这样一种方式,每个锁定时间只与第一个解锁时间配对,这比加入的锁定时间大。因此,生成的示例表为:

user   |  lock_time   | unlock_time
-------------------------------------
a | 2016-11-03 04:53:57 | 2016-11-04 05:47:51
b | 2016-11-14 00:50:38 | 2016-11-15 13:56:28
b | 2016-12-04 20:52:18 | 2016-12-05 23:10:51
d | 2016-11-14 16:41:01 | 2016-11-15 13:36:29
我在这里感兴趣的是锁定时间和解锁时间之间的时间,因此对于锁定/解锁之间不可能匹配的实例,应该删除该行

可以保证在给定的一天内不会有多个锁定时间或解锁时间,但可能存在两个日期不同的锁定时间,仅与一个解锁时间匹配。在这种情况下,我想要第一次锁定


示例:用户A在2016-11-03和2016-11-04锁定,但仅在2016-11-04解锁。

简单方法-使用相关子查询查找锁定时间后用户的第一次解锁时间:

select t1.user, t1.lock_time,
      (select min(t2.unlock_time) from t2
       where t2.unlock_time > t1.lock_time
         and t1.user = t2.user)
from t1

简单方法-使用相关子查询查找用户在锁定时间之后的第一次解锁时间:

select t1.user, t1.lock_time,
      (select min(t2.unlock_time) from t2
       where t2.unlock_time > t1.lock_time
         and t1.user = t2.user)
from t1

您还没有发布完整的表列详细信息,我根据您的示例编写了查询。这可能有用,试试看

select t1.user,t1.lock_time, t2.unlock_time  from T1 t1, T2 t2 where t1.user=t2.user and t2.unlock_time >= t1.lock_time;

您还没有发布完整的表列详细信息,我根据您的示例编写了查询。这可能有用,试试看

select t1.user,t1.lock_time, t2.unlock_time  from T1 t1, T2 t2 where t1.user=t2.user and t2.unlock_time >= t1.lock_time;

您可以通过条件l.user=u.user和l.lock\u time T2

结果:

user   |  lock_time          | unlock_time
-------------------------------------
d      | 2016-11-14 16:41:01 | 2016-11-15 13:36:29
在获得最小解锁时间后,您可以获得最小锁定时间


您可以通过条件l.user=u.user和l.lock\u time T2

结果:

user   |  lock_time          | unlock_time
-------------------------------------
d      | 2016-11-14 16:41:01 | 2016-11-15 13:36:29
在获得最小解锁时间后,您可以获得最小锁定时间



糟糕的桌子设计。如何匹配锁定/解锁?您使用的是哪些RDBMS?jarlh:这些是根据帐户状态更改日志创建的子表。这里的用户是指可以多次锁定/解锁用户帐户。我对每次锁定/解锁之间的时间很感兴趣,但将每个锁定与第一次可能的解锁进行匹配才有意义。糟糕的表设计。如何匹配锁定/解锁?您使用的是哪些RDBMS?jarlh:这些是根据帐户状态更改日志创建的子表。这里的用户是指可以多次锁定/解锁用户帐户。我对每次锁定/解锁之间的时间感兴趣,但只有将每个锁定与第一次可能的解锁进行匹配才有意义。如果T1包含与T2不匹配的数据,此查询将返回“null”作为解锁时间。例如:如果您插入此数据:insert into T1user,lock_时间值'c','2016-12-04 20:52:18',查询将返回额外的行:| c | 2016-12-04 20:52:18 | null |@VladBochenin,我知道。OP没有指定在这种情况下的预期结果,但我认为null在这里是有意义的。对不起,如果有锁定时间,但没有匹配的解锁时间,那么应该删除该行。理由:我对锁之间的时间感兴趣/unlock@Stiffo,不能将这些行添加到现有样本数据中吗?为了使问题更清楚。@jarlh我添加了我现在的意思示例。如果T1包含与T2不匹配的数据,则此查询将返回“null”作为解锁时间。例如:如果您插入此数据:insert into T1user,lock_时间值'c','2016-12-04 20:52:18',查询将返回额外的行:| c | 2016-12-04 20:52:18 | null |@VladBochenin,我知道。OP没有指定在这种情况下的预期结果,但我认为null在这里是有意义的。对不起,如果有锁定时间,但没有匹配的解锁时间,那么应该删除该行。理由:我对锁之间的时间感兴趣/unlock@Stiffo,不能将这些行添加到现有样本数据中吗?为了让问题更清楚。@jarlh我添加了我现在的意思的示例。这个查询为bI返回了3行。我对这个答案投了反对票,因为它只是将所有后续解锁与每个锁连接起来。此外,您建议的联接语法在1992年变得多余。此查询为bI返回3行,因为它只是将所有后续解锁与每个锁联接起来。此外,您建议的连接语法在1992年变得多余。
user   |  unlock_time   
----------------------
d      | 2016-11-15 13:36:29
user   |  lock_time          | unlock_time
-------------------------------------
d      | 2016-11-14 16:41:01 | 2016-11-15 13:36:29
select l1.user, min(l1.lock_time) lock_time, l1.unlock_time
from (
     SELECT
        l.user,
        l.lock_time,
        min(u.unlock_time) AS unlock_time
     FROM
         T1 l
         JOIN T2 u ON l.user = u.user AND l.lock_time < u.unlock_time
     GROUP BY l.user, l.lock_time
) as l1
group by l1.user, l1.unlock_time