WITH CurrentTerm AS ( SELECT course_start_time, course_end_time FROM gxxs.jw_school_calendar WHERE CURRENT_DATE BETWEEN course_start_time AND course_end_time LIMIT 1 ), StudentData AS ( SELECT COALESCE(XH, CONCAT('ID', DENSE_RANK() OVER (ORDER BY NJ, XM))) AS xh, NJ, XM, qdjg FROM zxjx_v_zxjx_qdsign AS x JOIN CurrentTerm AS y ON x.qddate :: DATE BETWEEN y.course_start_time AND y.course_end_time WHERE nj IS NOT NULL ), studentkuangke AS ( SELECT xh, NJ, XM, COUNT(CASE WHEN qdjg = '01' THEN 1 END) AS kkcs FROM StudentData GROUP BY xh, NJ, XM ) SELECT * FROM studentkuangke WHERE kkcs > 15 AND kkcs <= 25;
时间: 2025-08-01 18:17:36 AIGC 浏览: 17
<think>嗯,用户给了一个SQL查询,看起来有点复杂。我需要先理解这个查询的结构和目的。首先,他们用了两个CTE:CurrentTerm和StudentData,然后是studentkuangke。最后筛选出kkcs在15到25之间的学生。
用户可能想知道这个查询的作用,或者他们可能想优化它,或者有错误需要调试。也有可能他们不理解某个部分,比如COALESCE或者DENSE_RANK的用途。或者他们可能想调整筛选条件,比如kkcs的范围。
我需要先分解每个CTE的作用。CurrentTerm确定当前学期的起止时间,通过当前日期在范围内查找。StudentData关联学生考勤数据和当前学期,生成学生ID,可能处理了缺失的学号。然后studentkuangke统计每个学生的旷课次数,最后筛选出15到25次的学生。
用户可能的问题包括:如何优化查询性能,特别是JOIN和子查询部分;COALESCE中的DENSE_RANK是否正确生成唯一ID;或者是否应该包括其他条件,比如特定年级。另外,可能想知道是否需要考虑其他考勤状态,或者时间范围是否正确。
相关问题可能涉及CTE的作用、COALESCE和DENSE_RANK的应用、COUNT CASE的使用,以及筛选条件的调整。还要考虑是否有性能问题,比如LIMIT 1在CurrentTerm中的影响,或者索引的使用情况。</think>该SQL查询的功能是统计当前学期内旷课次数在16到25次之间的学生记录。以下是分步解析:
1. **CurrentTerm CTE**:
- 获取当前日期所在学期的起止时间
- 使用LIMIT 1防止出现多个学期重叠的情况
2. **StudentData CTE**:
- 生成标准化学生ID(优先使用原始学号XH,缺失时用年级+姓名生成唯一ID)
- 关联考勤数据与学期时间范围
- 筛选非空年级(NJ)的记录
3. **studentkuangke CTE**:
- 统计每个学生的旷课次数(qdjg='01'表示旷课)
- 按学号分组聚合
4. 最终查询:
- 筛选旷课次数在16-25次之间的学生
```sql
-- 原始查询保持不变
WITH CurrentTerm AS (...), StudentData AS (...), studentkuangke AS (...)
SELECT * FROM studentkuangke WHERE kkcs > 15 AND kkcs <= 25;
```
阅读全文
相关推荐


















