多条件数据库数据查询:特定Type记录筛选需求
解决方案:符合条件的数据查询
咱们先把你的查询需求拆解清楚:要找出那些出现次数大于1的Type,这类Type必须同时满足两个核心条件:
- 存在至少一行
Status1 = 'AAA'的记录 - 存在另一行同Type的记录,它的日期比上述AAA行的日期晚,且
Status2 = 'C'、Status3 = 'D'
方法一:使用EXISTS子查询实现
假设你的表名为your_table,可以用以下SQL语句直接实现需求:
SELECT DISTINCT t.* FROM your_table t WHERE -- 条件1:当前Type在表中出现次数大于1 (SELECT COUNT(*) FROM your_table WHERE Type = t.Type) > 1 -- 条件2:当前Type存在Status1为AAA的行 AND EXISTS ( SELECT 1 FROM your_table WHERE Type = t.Type AND Status1 = 'AAA' ) -- 条件3:当前Type存在日期晚于某条AAA行,且符合Status2=C、Status3=D的行 AND EXISTS ( SELECT 1 FROM your_table t_aaa JOIN your_table t_cd ON t_aaa.Type = t_cd.Type WHERE t_aaa.Type = t.Type AND t_aaa.Status1 = 'AAA' AND t_cd.Date > t_aaa.Date AND t_cd.Status2 = 'C' AND t_cd.Status3 = 'D' );
方法二:使用窗口函数优化(更高效)
如果你的数据库支持窗口函数(比如MySQL 8+、PostgreSQL、SQL Server等),可以先通过窗口函数提前计算每个Type的关键统计信息,这样查询效率会更高:
WITH type_stats AS ( SELECT Type, COUNT(*) OVER (PARTITION BY Type) AS type_count, MAX(CASE WHEN Status1 = 'AAA' THEN 1 ELSE 0 END) OVER (PARTITION BY Type) AS has_aaa, MAX( CASE WHEN EXISTS ( SELECT 1 FROM your_table t2 WHERE t2.Type = t.Type AND t2.Date > t.Date AND t2.Status2 = 'C' AND t2.Status3 = 'D' ) AND Status1 = 'AAA' THEN 1 ELSE 0 END ) OVER (PARTITION BY Type) AS has_later_cd FROM your_table t ) SELECT DISTINCT t.* FROM your_table t JOIN type_stats ts ON t.Type = ts.Type WHERE ts.type_count > 1 AND ts.has_aaa = 1 AND ts.has_later_cd = 1;
结果验证(用你提供的示例数据)
你的示例数据如下:
| ID | Type | Date | Status1 | Status2 | Status3 |
|---|---|---|---|---|---|
| 1 | 458 | 2018-01-01 15:04:06 | AAA | A | B |
| 2 | 471 | 2017-12-31 15:04:06 | AAA | A | B |
| 3 | 458 | 2018-01-15 15:04:06 | BBC | C | D |
| 5 | 458 | 2018-01-18 15:04:06 | AAA | X | D |
符合所有条件的Type是458:
- 它累计出现3次(满足次数>1)
- 存在Status1=AAA的行(ID1、ID5)
- 存在日期晚于ID1的行(ID3),且Status2=C、Status3=D
最终查询会返回Type=458的所有记录,如果你只需要特定行,可以调整SELECT的字段内容。
内容的提问来源于stack exchange,提问作者Vector JX
相关产品推荐
相关产品推荐

