You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

双表关联下基于日期存在性的后续事件日期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会得到:

useridnext_event_date
012018-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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:58:42