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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 09:24:27