双表关联下基于日期存在性的后续事件日期SQL查询需求
解决思路与修正后的SQL
我来帮你搞定这个SQL逻辑~先明确你的核心需求:只有当table_2里的用户存在非空日期时,才找出该用户在table_1中event为'A'且晚于这个日期的最早事件日期。原SQL还没处理日期过滤和取最早日期的逻辑,下面是完善后的方案:
SELECT t1.userid, MIN(t1.date) AS next_event_date FROM table_1 t1 JOIN table_2 t2 ON t1.userid = t2.userid WHERE t1.event = 'A' AND t2.date IS NOT NULL AND t1.date > t2.date GROUP BY t1.userid;
代码细节解释:
- 用
JOIN替代LEFT JOIN:因为我们只需要table_2中存在非空日期的用户,内连接可以直接过滤掉table_2里date为NULL的用户(比如你的测试数据里的userid=02) t2.date IS NOT NULL:精准匹配需求里“仅当存在非空日期时处理”的条件t1.date > t2.date:只保留table_1中晚于table_2指定日期的事件记录MIN(t1.date)+GROUP BY t1.userid:对每个符合条件的用户,取最早的那个后续事件日期,正好对应你要的“下一个事件日期”
测试结果验证:
基于你给出的测试数据,运行这段SQL会得到:
| userid | next_event_date |
|---|---|
| 01 | 2018-01-02 |
完全符合预期:userid=01在table_2的日期是2018-01-01,table_1中晚于该日期的event='A'的最早日期是2018-01-02;userid=02因为table_2.date为NULL被排除;userid=03的event是'B'也被过滤。
如果需要保留所有table_2中有非空日期的用户(哪怕table_1里没有符合条件的事件,显示NULL),可以调整为左连接+分组的写法:
SELECT t2.userid, MIN(CASE WHEN t1.event = 'A' AND t1.date > t2.date THEN t1.date END) AS next_event_date FROM table_2 t2 LEFT JOIN table_1 t1 ON t1.userid = t2.userid WHERE t2.date IS NOT NULL GROUP BY t2.userid;
内容的提问来源于stack exchange,提问作者kazzi
相关产品推荐
相关产品推荐

