Sql 如果存在日期,则显示下一个日期
我有一个表,其中包含事件发生的所有日期,但我只想显示另一个表中存在日期时发生的下一个事件 这是我的逻辑——我有两张表: 表1Sql 如果存在日期,则显示下一个日期,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个表,其中包含事件发生的所有日期,但我只想显示另一个表中存在日期时发生的下一个事件 这是我的逻辑——我有两张表: 表1 userid date event 01 2018-01-01 A 01 2018-01-02 A 02 2018-01-01 A 03 2018-01-01 B 表2 userid date 01 2018-01-01 02
userid date event
01 2018-01-01 A
01 2018-01-02 A
02 2018-01-01 A
03 2018-01-01 B
表2
userid date
01 2018-01-01
02 NULL
到目前为止,我所拥有的:
SELECT t1.userid, t1.date
FROM table_1 as t1
LEFT JOIN table_2 as t2 ON t1.userid = t2.userid
WHERE 1.event = 'A'
基本上,我想确定table_2.date是否不为空
然后显示table_1.date
wheretable_1.date>table_2.date
结果应该如下所示:
userid date
01 2018-01-02
由于userid 01在表2中有一个日期值,因此我得到的日期大于表2中的日期。您可以使用
exists
:
select t1.*
from table_1 t1
where event = 'A' and
exists (select 1
from table_2 t2
where t2.userid = t1.userid and
(t2.date is not null and t1.date > t2.date));
但是,不是空的
过滤器在这里是多余的,您可以直接将其简化为
where event = 'A' and
exists (select 1 from table_2 t2
where t2.userid = t1.userid and t1.date > t2.date);
让我们来看一个相关子查询:
select t2.*,
(select top (1) t1.date
from table1 t1
where t1.userid = t2.userid and t1.event = 'A' and t1.date > t2.date
order by t2.date desc
) t1_date
from table2 t2
where t2.date is not null;
你把大部分逻辑都写进了你的问题。只要使用一个左连接,你就应该有99.999%的路径。我想这可能需要更多的细节。相同的
userid
能否在表2
中多次出现?如果是,这将如何影响预期结果?此外,您还写道,您需要“下一个事件”-单数。这是否意味着,例如,如果表_1
有一个附加记录,其中userid=01
和date=2018-01-03
,则预期结果仍然只包括该用户的2018-01-02事件?@JoeFarrell很抱歉造成混淆。表2中的用户ID只显示一次。但是,它将在表1中多次显示。我会补充更多细节。基本上,表1有一个偶数标识符,将显示在表2中。这个答案完全有效,谢谢!我使用您共享的子查询两次,共两列,一列显示日期,一列显示事件类型。我知道我在最初的问题中没有提到这一点,但是有没有更有效的方法呢?@kazzi。你能再问一个问题吗?