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

学校考勤登记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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:32:22