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

SQL Server查询分组内至少1条记录创建日期早于当前日期的方法

筛选分组内存在早于当前日期创建记录的SQL实现

需求背景

目标表结构如下:

  • Id:记录主键
  • GroupId:记录所属分组ID
  • CreatedDate:记录创建时间
    需要查询返回所有满足以下规则的记录:记录所属的分组中,至少有1条记录的创建日期早于当前日期。

示例数据与预期结果

测试数据:

  • GroupId=1:Id=1创建时间为2022-06-26 10:51:30,Id=2、Id=3创建时间为2022-06-27 10:51:30
  • GroupId=2:Id=4、Id=5创建时间均为2022-06-27 10:51:30

预期返回Id=1、2、3的全部记录;GroupId=2下没有早于当前日期的记录,因此Id=4、5不返回。

可用写法

写法1:EXISTS关联查询(推荐,大表性能更好)

SELECT t1.*
FROM 替换为你的实际表名 t1
WHERE EXISTS (
    SELECT 1
    FROM 替换为你的实际表名 t2
    WHERE t2.GroupId = t1.GroupId
      AND t2.CreatedDate < CURRENT_DATE
)

逻辑说明:遍历原表每条记录时,只要能在同分组下找到任意一条创建时间早于当前日期的记录,就保留当前记录。EXISTS匹配到第一条符合条件的记录就会终止子查询扫描,执行效率更高。

写法2:IN子查询

SELECT *
FROM 替换为你的实际表名
WHERE GroupId IN (
    SELECT GroupId
    FROM 替换为你的实际表名
    WHERE CreatedDate < CURRENT_DATE
    GROUP BY GroupId
)

逻辑说明:先通过子查询查出所有符合条件的分组ID集合,再从原表中取出属于这些分组的所有记录,写法直观,适合快速理解逻辑。

不同数据库适配提示

不同数据库获取当前日期的语法有区别,使用时可根据实际环境替换CURRENT_DATE:

  • MySQL:可直接用CURDATE()或CURRENT_DATE
  • SQL Server:建议用CAST(GETDATE() AS DATE),避免datetime类型带的时分秒导致匹配误差
  • Oracle:用TRUNC(SYSDATE)做日期截断
  • PostgreSQL:原生支持CURRENT_DATE,无需修改

内容的提问来源于stack exchange,提问作者Abhishek Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 09:48:52