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

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;

逻辑说明:

  1. WHERE子句先筛掉Type≠2和非2018年的记录,减少后续分组的数据量;
  2. 按accountId分组后,用SUM+CASE的组合分别统计每个账户在1、2、3月的记录数;
  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
  );

逻辑说明:

  1. 先从2018年1月的Type=2记录中取出所有accountId;
  2. 通过EXISTS子查询验证同一个accountId存在对应的3月记录;
  3. 通过NOT EXISTS子查询确保该accountId完全没有2月的记录;
  4. 用DISTINCT去重,避免同一个accountId因为多条1月记录重复出现。

注意事项:

  • 记得把代码里的your_date_column替换成你表中实际存储日期的字段名;
  • 如果你的表是用单独的year和month字段存储年份月份的,只需要把YEAR(...)和MONTH(...)的条件改成直接匹配字段值即可(比如year = 2018、month = 1)。

内容的提问来源于stack exchange,提问作者Terkel Brix

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:58:48