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

如何构建SQL实现含并列积分的Top3用户查询?

解决Top3积分包含并列用户的SQL方案

嗨,这个问题我之前做业务报表的时候也碰到过——用LIMIT 3确实会把并列第三的用户给漏掉,因为它只取前3行,不管积分是不是并列。咱们得换个思路:找出所有积分属于「前3个最高积分值」的用户,而不是只取前3条记录。

给你两种实用的解决方案,适配不同的数据库场景:

方法一:子查询获取前3个不同积分值(兼容多数数据库)

这种方法适合不支持窗口函数的老版本数据库(比如MySQL 5.x),核心是先拿到去重后的前3个最高积分,再筛选用户:

SELECT UserID, point
FROM 用户表
WHERE point IN (
    -- 先取出去重后的前3个最高积分:100、99、98
    SELECT DISTINCT point
    FROM 用户表
    ORDER BY point DESC
    LIMIT 3
)
-- 最后按积分降序、用户ID排序,结果更清晰
ORDER BY point DESC, UserID;

方法二:用窗口函数DENSE_RANK()(推荐,支持窗口函数的数据库)

如果你的数据库支持窗口函数(比如MySQL 8+、PostgreSQL、SQL Server、Oracle等),用DENSE_RANK()会更直观。它会给相同积分的用户分配相同的排名,而且排名是连续的(不会因为并列跳过数字):

SELECT UserID, point
FROM (
    SELECT 
        UserID, 
        point,
        -- 按积分降序排名,相同积分排名相同
        DENSE_RANK() OVER (ORDER BY point DESC) AS 积分排名
    FROM 用户表
) AS 带排名的用户表
WHERE 积分排名 <= 3
ORDER BY point DESC, UserID;

用这个方法的话,003和004的积分都会被标记为第3名,筛选积分排名 <=3就能把他们都包含进来,完美符合你的需求~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:24:37