学校考勤登记SQL查询:筛选指定日期内sid出现2次及以上的行
解决方案:筛选指定日期范围内重复出现的sid记录
嘿,我来帮你搞定这个考勤系统的SQL查询需求!针对你要找出4月4日至4月6日期间,sid出现2次及以上的所有记录的需求,我给你提供两种实用的查询方案,适配不同的数据库场景:
方案一:子查询关联法(兼容所有主流数据库)
这种方法先通过子查询筛选出符合次数要求的sid,再关联原表获取完整记录,适合所有支持基础SQL语法的数据库(比如MySQL 5.x、Oracle等)。
假设你的考勤表名为attendance,核心字段包括sid、att_date(日期类型)、att_month,查询语句如下:
SELECT a.* FROM attendance a -- 子查询:统计目标日期内每个sid的出现次数,筛选出≥2次的sid JOIN ( SELECT sid FROM attendance WHERE att_date BETWEEN '2024-04-04' AND '2024-04-06' -- 如果att_month是数字类型(比如4),可以加这个条件优化查询:AND att_month = 4 GROUP BY sid HAVING COUNT(*) >= 2 ) AS target_sids ON a.sid = target_sids.sid -- 再次过滤日期,确保只取目标范围内的记录 WHERE a.att_date BETWEEN '2024-04-04' AND '2024-04-06' -- 可选:按sid和日期排序,方便查看同一sid的记录 ORDER BY a.sid, a.att_date;
方案二:窗口函数法(简洁高效,适合现代数据库)
如果你的数据库支持窗口函数(比如MySQL 8.0+、PostgreSQL、SQL Server 2012+),这个方案更简洁,性能也更优,不需要额外的关联操作。
查询语句如下:
SELECT sid, att_date, att_month -- 替换成你需要展示的所有字段 FROM ( SELECT *, -- 窗口函数:计算每个sid在目标日期范围内的总出现次数 COUNT(*) OVER (PARTITION BY sid) AS sid_total_count FROM attendance WHERE att_date BETWEEN '2024-04-04' AND '2024-04-06' -- 可选:加上att_month过滤优化性能:AND att_month = 4 ) AS temp_table -- 筛选出出现次数≥2的记录 WHERE sid_total_count >= 2 ORDER BY sid, att_date;
注意事项
- 日期格式:确保
att_date的格式和你查询中使用的日期字符串一致(比如'YYYY-MM-DD'),如果是日期类型则无需担心格式问题。 - 性能优化:如果
att_month是用来分区或索引的字段,加上AND att_month = 4可以快速缩小查询范围,提升效率。 - 字段替换:把示例中的
attendance表名和字段替换成你实际使用的名称即可。
内容的提问来源于stack exchange,提问作者Imran Omer
相关产品推荐
相关产品推荐

