2

我有这个项目,它根据分数对不同的项目进行排名,排名还可以,但是当分数相同时,它会显示差距。

这是查询:

SELECT bgycode, scc_bgyscoretotal, FIND_IN_SET( scc_bgyscoretotal, (
SELECT GROUP_CONCAT(DISTINCT scc_bgyscoretotal
ORDER BY scc_bgyscoretotal DESC ) FROM bgyprofile)
) AS rank
FROM bgyprofile

它输出如下:

输出

有任何解决这个问题的方法吗?在此先感谢抱歉英语不好

4

1 回答 1

1

您基本上需要Dense_Rank()类似的功能(在 MySQL版本 >= 8.0中可用)。在旧版本的 MySQL中,可以使用会话变量来模拟它。

  • Derived table 中,确定 a 的排名scc_bgyscoretotal(具有排名 1 的最高值,依此类推)。首先,获取 的唯一值scc_bgyscoretotal,然后使用Session Variables确定它们的排名。
  • 现在,只需使用.这些派生表连接到主表即可。bgyprofilescc_bgyscoretotal

尝试以下操作:

SELECT t2.bgycode, 
       t2.scc_bgyscoretotal, 
       dt2.`rank` 
FROM bgyprofile AS t2 
JOIN 
(
 SELECT dt1.scc_bgyscoretotal, 
        @rank_no := @rank_no + 1 AS `rank`  
 FROM 
 (
  SELECT t1.scc_bgyscoretotal 
  FROM bgyprofile AS t1 
  GROUP BY t1.scc_bgyscoretotal 
  ORDER BY t1.scc_bgyscoretotal DESC
 ) AS dt1 
 CROSS JOIN (SELECT @rank_no := 0) AS init1
) AS dt2 ON dt2.scc_bgyscoretotal = t2.scc_bgyscoretotal 
于 2018-10-05T04:26:25.387 回答