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

在SQL Server中查找并列分数,除RANK WITH TIES外有无简便方法?

问题描述

现有如下结构的学生测验成绩表:

studentquizIdscore
A190
B195
A287
B287

期望得到的查询结果:

quizIdhighestGradeisTie
1950
2871

请问除了使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 19:53:27