SQL查询需求:识别缺少前置EV2的EV3事件记录
识别无前置EV2的EV3事件SQL查询
我们需要从events表中筛选出所有未对应前置EV2记录的EV3事件,返回对应的Cust-ID、Event-ID和Time字段。
方案一:窗口函数写法(适用于MySQL 8+、PostgreSQL、SQL Server等)
这种写法效率较高,尤其适用于大数据量场景:
SELECT Cust_ID, Event_ID, Time FROM ( SELECT Cust_ID, Event_ID, Time, -- 获取当前EV3记录之前,同一客户最近的EV2事件时间 MAX(CASE WHEN Event_ID = 'EV2' THEN Time END) OVER ( PARTITION BY Cust_ID ORDER BY Time ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING ) AS last_ev2_time FROM events ) AS sub_query WHERE Event_ID = 'EV3' AND last_ev2_time IS NULL;
逻辑说明
- 子查询通过窗口函数按客户分组、时间排序,为每条记录标记出其之前最近的EV2事件时间。
- 外层筛选出EV3事件中,
last_ev2_time为NULL的记录——这些就是没有前置EV2的违规EV3。
方案二:关联查询写法(兼容低版本数据库)
如果你的数据库不支持窗口函数,可以使用NOT EXISTS关联查询:
SELECT e.Cust_ID, e.Event_ID, e.Time FROM events e WHERE e.Event_ID = 'EV3' AND NOT EXISTS ( SELECT 1 FROM events e2 WHERE e2.Cust_ID = e.Cust_ID AND e2.Event_ID = 'EV2' AND e2.Time < e.Time );
逻辑说明
- 对每条EV3记录,检查同一客户是否存在时间更早的EV2记录。若不存在,则返回这条EV3。
示例验证
若数据表包含Cust-ID为1的EV1、EV3、EV4、EV5记录,上述两种查询都会返回1, EV3, 10:30这条缺失前置EV2的记录,符合需求。
内容的提问来源于stack exchange,提问作者Vikash Jain
相关产品推荐
相关产品推荐

