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

如何用SQL获取每个用户最高的resultPoint及对应resultPercentage

如何获取每个用户的最高分数记录?

我是SQL新手,当前使用的查询语句如下:

SELECT DISTINCT
info_person.userUsername,
infoExamResult.resultPoint,
infoExamResult.resultPercentage,
infoExamResult.optAnswer
FROM info_person
INNER JOIN infoExamResult ON infoExamResult.personID = info_person.personID
where infoExamResult.datetimeStart BETWEEN "2024-03-18" AND "2024-03-26"
and infoExamResult.optAnswer = "COMMIT"
ORDER BY info_person.userUsername

当前查询输出结果:

+-------------------+-------------------+------------------+-----------+
|    userUsername   |    resultPoint   |  ResultPercentage | optAnswer |
+-------------------+-------------------+------------------+-----------+
|    NSO001000      |      20          |       50%         |   COMMIT  |
|    NSO001000      |      10          |       25%         |   COMMIT  |
|    NSO002000      |      40          |       100%        |   COMMIT  |
|    NSO002000      |      30          |       75%         |   COMMIT  |
+-------------------+-------------------+------------------+-----------+

我需要获取每个userUsername对应的最高resultPoint记录,期望输出如下:

+-------------------+-------------------+------------------+-----------+
|    userUsername   |    resultPoint   |  ResultPercentage | optAnswer |
+-------------------+-------------------+------------------+-----------+
|    NSO001000      |      20          |       50%         |   COMMIT  |
|    NSO002000      |      40          |       100%        |   COMMIT  |
+-------------------+-------------------+------------------+-----------+

解决方案

方法1:窗口函数(推荐,适配现代SQL数据库)

窗口函数可以直接按用户分组并标记最高分记录,逻辑清晰且效率较高,支持MySQL 8.0+、PostgreSQL、SQL Server等主流数据库:

SELECT userUsername, resultPoint, resultPercentage, optAnswer
FROM (
    SELECT 
        info_person.userUsername,
        infoExamResult.resultPoint,
        infoExamResult.resultPercentage,
        infoExamResult.optAnswer,
        -- 按用户分组,每组内按分数降序排序,最高分记为第1条
        ROW_NUMBER() OVER (PARTITION BY info_person.userUsername ORDER BY infoExamResult.resultPoint DESC) AS rank_num
    FROM info_person
    INNER JOIN infoExamResult ON infoExamResult.personID = info_person.personID
    WHERE infoExamResult.datetimeStart BETWEEN "2024-03-18" AND "2024-03-26"
      AND infoExamResult.optAnswer = "COMMIT"
) AS ranked_results
-- 只保留每组的第1条记录(即最高分)
WHERE rank_num = 1
ORDER BY userUsername;

方法2:子查询(兼容旧版数据库)

如果你的数据库不支持窗口函数,可以先通过子查询找出每个用户的最高分,再关联原表获取对应记录:

SELECT 
    p.userUsername,
    er.resultPoint,
    er.resultPercentage,
    er.optAnswer
FROM info_person p
INNER JOIN infoExamResult er 
    ON er.personID = p.personID
INNER JOIN (
    -- 先找出符合条件的每个用户的最高分
    SELECT personID, MAX(resultPoint) AS max_score
    FROM infoExamResult
    WHERE datetimeStart BETWEEN "2024-03-18" AND "2024-03-26"
      AND optAnswer = "COMMIT"
    GROUP BY personID
) AS user_max_scores 
    ON er.personID = user_max_scores.personID 
    AND er.resultPoint = user_max_scores.max_score
WHERE er.datetimeStart BETWEEN "2024-03-18" AND "2024-03-26"
  AND er.optAnswer = "COMMIT"
ORDER BY p.userUsername;

注意:如果同一用户存在多条分数相同的最高分记录,此方法会返回所有这些记录;若只需单条,可添加DISTINCT关键字。


内容的提问来源于stack exchange,提问作者Wu C

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 15:08:37