在SQL Server中查找并列分数,除RANK WITH TIES外有无简便方法?
问题描述
现有如下结构的学生测验成绩表:
| student | quizId | score |
|---|---|---|
| A | 1 | 90 |
| B | 1 | 95 |
| A | 2 | 87 |
| B | 2 | 87 |
期望得到的查询结果:
| quizId | highestGrade | isTie |
|---|---|---|
| 1 | 95 | 0 |
| 2 | 87 | 1 |
请问除了使用RANK WITH TIES语句外,是否存在更简便的实现方式?
实现方案
当然有,以下是几种简洁高效的实现方式:
方式一:子查询聚合判断
先筛选出每个测验的最高分记录,再分组统计该分数的出现次数,以此判断是否平局:
SELECT quizId, MAX(score) AS highestGrade, CASE WHEN COUNT(*) > 1 THEN 1 ELSE 0 END AS isTie FROM ( SELECT quizId, score FROM your_table WHERE score = (SELECT MAX(score) FROM your_table t WHERE t.quizId = your_table.quizId) ) ranked_scores GROUP BY quizId;
方式二:窗口函数配合聚合
用窗口函数先计算每个测验的最高分,再筛选出最高分对应的记录,最后统计学生数量判断平局:
SELECT quizId, MAX(score) AS highestGrade, CASE WHEN COUNT(DISTINCT student) > 1 THEN 1 ELSE 0 END AS isTie FROM ( SELECT *, MAX(score) OVER (PARTITION BY quizId) AS max_score FROM your_table ) score_with_max WHERE score = max_score GROUP BY quizId;
方式三:单分组聚合简化写法
无需子查询,直接在分组中结合条件统计和符号函数实现逻辑:
SELECT quizId, MAX(score) AS highestGrade, SIGN(SUM(CASE WHEN score = MAX(score) THEN 1 ELSE 0 END) - 1) AS isTie FROM your_table GROUP BY quizId;
说明:SIGN()函数会将正数转为1、0转为0,刚好匹配isTie的需求——当最高分出现次数超过1时返回1,否则返回0。
内容的提问来源于stack exchange,提问作者Yoav24
相关产品推荐
相关产品推荐

