如何筛选含跨20小时临界值的累计时长达标课程集合?
我明白你的问题了——原来的查询只抓了累计时长刚好在20小时以内的课程,但那种“最后一根稻草”式的课程(加入前累计<20,加入后超20)被漏掉了。咱们来调整一下逻辑:
调整后的SQL代码
SELECT ID, Course FROM ( SELECT a.ID, a.COURSE, a.DURATION, SUM(b.DURATION) AS CUM_SUM, -- 计算当前课程加入前的累计时长 SUM(b.DURATION) - a.DURATION AS PREV_CUM_SUM FROM #TempTable a JOIN #TempTable b ON a.ID >= b.ID GROUP BY a.ID,a.COURSE,a.DURATION ) temp WHERE -- 第一类:累计时长≤20的课程 CUM_SUM <= 20 -- 新增:跨临界的课程——加入前累计<20,加入后超20 OR (PREV_CUM_SUM < 20 AND CUM_SUM > 20)
逻辑说明
- 新增
PREV_CUM_SUM字段:这个字段用来计算当前课程加入前的总累计时长(等于当前累计总和减去当前课程的时长),帮我们判断这门课是不是导致累计跨到20小时以上的那一门。 - 扩展筛选条件:
- 保留原有的
CUM_SUM <=20,确保累计时长没超20的课程都被选中; - 新增
OR (PREV_CUM_SUM <20 AND CUM_SUM>20),专门捕捉那种“加入前还在20以内,加入后超了”的课程,也就是你说的从19跨到23的情况。
- 保留原有的
如果需要排除单门课程时长就超过20小时的极端情况(比如一门课直接25小时),可以在WHERE条件里再加个AND a.DURATION <=20,根据你的实际需求调整就行。
内容的提问来源于stack exchange,提问作者sudominmonk
相关产品推荐
相关产品推荐

