SQL查询编写求助:筛选2018年符合指定月份条件的accountId
解决SQL查询:找出符合特定月份记录条件的accountId
嗨,我来帮你搞定这个查询需求!你需要的是同时拥有2018年1月和3月Type=2的余额记录,且完全没有2018年2月Type=2记录的accountId,对吧?下面给你两种实用的实现方式,你可以根据自己的数据库环境选择:
方法一:使用GROUP BY + HAVING(推荐,性能更优)
这种方式先过滤出目标范围的数据,再通过分组统计来验证条件:
SELECT accountId FROM Balance WHERE Type = 2 AND YEAR(your_date_column) = 2018 -- 替换成你实际存储日期的字段名 GROUP BY accountId HAVING -- 确保1月至少有一条记录 SUM(CASE WHEN MONTH(your_date_column) = 1 THEN 1 ELSE 0 END) > 0 -- 确保3月至少有一条记录 AND SUM(CASE WHEN MONTH(your_date_column) = 3 THEN 1 ELSE 0 END) > 0 -- 确保2月完全没有记录 AND SUM(CASE WHEN MONTH(your_date_column) = 2 THEN 1 ELSE 0 END) = 0;
逻辑说明:
WHERE子句先筛掉Type≠2和非2018年的记录,减少后续分组的数据量;- 按
accountId分组后,用SUM+CASE的组合分别统计每个账户在1、2、3月的记录数; - 通过
HAVING条件严格校验:1月和3月的记录数必须大于0(同时存在),2月记录数必须为0(完全不存在)。
方法二:使用EXISTS + NOT EXISTS(逻辑更直观)
如果你觉得分组的方式有点绕,也可以用关联子查询来实现,逻辑更直白:
SELECT DISTINCT b1.accountId FROM Balance b1 WHERE b1.Type = 2 AND YEAR(b1.your_date_column) = 2018 AND MONTH(b1.your_date_column) = 1 -- 确认该账户有2018年3月的Type=2记录 AND EXISTS ( SELECT 1 FROM Balance b3 WHERE b3.accountId = b1.accountId AND b3.Type = 2 AND YEAR(b3.your_date_column) = 2018 AND MONTH(b3.your_date_column) = 3 ) -- 确认该账户没有2018年2月的Type=2记录 AND NOT EXISTS ( SELECT 1 FROM Balance b2 WHERE b2.accountId = b1.accountId AND b2.Type = 2 AND YEAR(b2.your_date_column) = 2018 AND MONTH(b2.your_date_column) = 2 );
逻辑说明:
- 先从2018年1月的Type=2记录中取出所有accountId;
- 通过
EXISTS子查询验证同一个accountId存在对应的3月记录; - 通过
NOT EXISTS子查询确保该accountId完全没有2月的记录; - 用
DISTINCT去重,避免同一个accountId因为多条1月记录重复出现。
注意事项:
- 记得把代码里的
your_date_column替换成你表中实际存储日期的字段名; - 如果你的表是用单独的
year和month字段存储年份月份的,只需要把YEAR(...)和MONTH(...)的条件改成直接匹配字段值即可(比如year = 2018、month = 1)。
内容的提问来源于stack exchange,提问作者Terkel Brix
相关产品推荐
相关产品推荐

