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

如何编写SQL查询:排除同一Subject下已关联Valid状态的Expired记录

需求与解决方案

需求说明

编写SELECT查询需满足以下规则:

  • 当同一empid+Subject组合下存在Valid状态记录时,排除该组合下的Expired状态结果
  • 若仅查询Expired状态,需返回0行结果

测试数据

empidSubjectStatus
Emp01S1Valid
Emp01S1Expired
Emp01S2Valid

现有查询及结果

查询1:无状态过滤分组

SELECT empid, subject 
FROM t1 
GROUP BY empid, subject

结果:

empidSubject
Emp01S1
Emp01S2

返回2行数据。

查询2:仅过滤Expired状态分组

SELECT empid, subject 
FROM t1 
WHERE (status = 'Expired')
GROUP BY empid, subject

结果:

empidSubject
Emp01S1

返回1行数据。

查询3:仅过滤Valid状态分组

SELECT empid, subject FROM t1 WHERE (status = 'Valid')
GROUP BY empid, subject

结果:

empidSubject
Emp01S1
Emp01S2

返回2行数据。

符合需求的解决方案

场景1:获取所有合规记录(排除有Valid的组合下的Expired)

该查询保留所有Valid记录,仅保留无对应Valid记录的Expired记录(若存在):

SELECT empid, subject, status
FROM t1
WHERE 
  status = 'Valid'
  OR NOT EXISTS (
    SELECT 1
    FROM t1 AS t2
    WHERE t2.empid = t1.empid
      AND t2.subject = t1.subject
      AND t2.status = 'Valid'
  );

结果:

empidSubjectStatus
Emp01S1Valid
Emp01S2Valid

场景2:查询Expired状态时返回0行

该查询过滤掉所有存在对应Valid记录的Expired条目,测试数据中返回0行:

SELECT empid, subject, status
FROM t1
WHERE 
  status = 'Expired'
  AND NOT EXISTS (
    SELECT 1
    FROM t1 AS t2
    WHERE t2.empid = t1.empid
      AND t2.subject = t1.subject
      AND t2.status = 'Valid'
  );

通用分组查询(仅返回empid+subject组合)

如果只需返回分组后的empid和subject,可使用以下查询:

SELECT empid, subject
FROM t1
GROUP BY empid, subject
HAVING SUM(CASE WHEN status = 'Valid' THEN 1 ELSE 0 END) > 0
OR (SUM(CASE WHEN status = 'Expired' THEN 1 ELSE 0 END) > 0 AND SUM(CASE WHEN status = 'Valid' THEN 1 ELSE 0 END) = 0);

测试数据中返回结果:

empidSubject
Emp01S1
Emp01S2

内容的提问来源于stack exchange,提问作者Rashad ras

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 10:42:42