SQL Server查询分组内至少1条记录创建日期早于当前日期的方法
筛选分组内存在早于当前日期创建记录的SQL实现
需求背景
目标表结构如下:
Id:记录主键GroupId:记录所属分组IDCreatedDate:记录创建时间
需要查询返回所有满足以下规则的记录:记录所属的分组中,至少有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
相关产品推荐
相关产品推荐

