SQL查询需求:筛选同EmployeeID下无提前4分钟EventTypeID=21的EventTypeID=19行
筛选EventTypeID=19且无对应提前4分钟EventTypeID=21关联记录的SQL解决方案
我来帮你搞定这个筛选需求,先明确下核心要求:我们要挑出EventTypeID = 19的记录,同时要排除那些同一EmployeeID下存在一条EventTypeID = 21、且时间恰好比这条19的记录早4分钟的行。结合你现有的查询,我调整出了符合要求的SQL语句,下面一步步说明:
需求回顾
- 目标记录:
EventTypeID = 19 - 排除条件:同一
EmployeeID下,存在EventTypeID = 21的记录,其LoggedOn时间 = 当前19记录的LoggedOn时间 - 4分钟
修改后的查询语句
SELECT * FROM ( -- 第一个数据源的日志记录 SELECT rcp..EventLogEntries.EmployeeID, rcp..EventLogEntries.EventTypeID, rcp..EventLogEntries.TerminalID, rcp..EventLogEntries.LoggedOn FROM rcp..EventLogEntries WHERE rcp..EventLogEntries.terminalid = 3 UNION -- 第二个数据源的日志记录,用显式JOIN更清晰,字段别名统一 SELECT viso..AccessUserPersons.UserExternalIdentifier AS EmployeeID, rcp..EventTypes.ID AS EventTypeID, rcp..Terminals.ID AS TerminalID, viso..EventLogEntries.LoggedOn FROM viso..EventLogEntries JOIN viso..AccessUserPersons ON viso..EventLogEntries.PersonID = viso..AccessUserPersons.ID JOIN rcp..Terminals ON viso..EventLogEntries.locationID = rcp..Terminals.TerminalTAID JOIN rcp..EventTypes ON rcp..EventTypes.Code = 36 WHERE viso..EventLogEntries.LocationID = 10 AND viso..EventLogEntries.EventCode = 615 ) results WHERE -- 先筛选出EventTypeID=19的记录 results.EventTypeID = 19 -- 排除存在对应提前4分钟的EventTypeID=21记录的行 AND NOT EXISTS ( SELECT 1 FROM results r2 WHERE r2.EmployeeID = results.EmployeeID AND r2.EventTypeID = 21 AND r2.LoggedOn = DATEADD(minute, -4, results.LoggedOn) ) ORDER BY LoggedOn;
关键逻辑说明
- 统一结果集:保留了你原有的
UNION合并两个数据源的逻辑,把第二个查询的隐式连接改成了显式JOIN(可读性更好),同时给字段加了别名确保和第一个查询的字段名一致,避免歧义。 - 筛选目标事件:直接在外部查询的
WHERE里过滤出EventTypeID=19的记录。 - 排除不符合条件的行:用
NOT EXISTS子查询检查,只要同一EmployeeID下有一条EventTypeID=21的记录时间刚好比当前19的记录早4分钟,就把这条19的记录排除掉。 - 保留TerminalID:按照你的要求,即使这个字段值始终是3,也保留在输出里满足后续处理的语法要求。
输入输出对比
原始合并结果
| EmployeeID | EventTypeID | TerminalID | LoggedOn |
|---|---|---|---|
| 273 | 19 | 3 | 2018-12-04 12:31:23.000 |
| 273 | 21 | 3 | 2018-12-04 12:34:18.000 |
| 483 | 19 | 3 | 2018-12-04 12:40:10.000 |
| 268 | 19 | 3 | 2018-12-04 13:19:23.000 |
| 273 | 21 | 3 | 2018-12-04 13:28:00.000 |
| 273 | 19 | 3 | 2018-12-04 13:32:00.000 |
| 459 | 19 | 3 | 2018-12-04 15:01:04.000 |
筛选后的期望输出
| EmployeeID | EventTypeID | TerminalID | LoggedOn |
|---|---|---|---|
| 273 | 19 | 3 | 2018-12-04 12:31:23.000 |
| 483 | 19 | 3 | 2018-12-04 12:40:10.000 |
| 268 | 19 | 3 | 2018-12-04 13:19:23.000 |
| 459 | 19 | 3 | 2018-12-04 15:01:04.000 |
注:你的期望输出里483的
LoggedOn时间写的是2018-12-04 12:30:10.000,应该是笔误,这里以原始输出里的12:40:10.000为准。
内容的提问来源于stack exchange,提问作者siemon
相关产品推荐
相关产品推荐

