榜单并列时排名怎么处理
榜单里出现三个一模一样的分数时,名次怎么排?不同规则会给出不同结果。把规则写清楚,比争哪个更对更重要。
三种常见写法
举例:五个分值依次为 90、80、80、80、70。
并列名次(跳过后续名次):1、2、2、2、5。三个 80 都排第 2,下一名跳到第 5。
密集名次(不跳号):1、2、2、2、3。三个 80 都排第 2,下一名是第 3。
加一个次级排序键:例如主键为分值降序、次键为代码升序,三个 80 就能稳定排出 2、3、4,下一名为 5。这种做法每次刷新顺序都不会变,适合需要固定位置的榜单。
为什么需要次级键
如果只按一个键排序,数据库返回并列行的先后顺序可能不稳定,同一份数据刷新两次,位置却换了。加上一个取值唯一的次级键(例如代码),排序结果就确定下来。
举例:代码 000001、000002、600001 三只分值都是 80,按代码升序得到 000001、000002、600001,对应名次 2、3、4。无论刷新多少次,这个顺序都不变。
并列行多时,占比要说明分母
若前 20 名里有 8 个并列分值,截取到第 20 名可能刚好把并列组切开。举例:某榜单取前 10 名,第 10 名与第 11、12 名同分。若按「严格前 10」返回 10 行,若按「含完整并列组」返回 12 行。两种结果都合理,但表头要写明用的是哪一种,否则隔天行数变化会被误读成数据波动。
行数差异校验:12 − 10 = 2 行,正好是并列组里被多带进来的两行。
排序键要写进榜单说明
建议在榜单下方固定写一行说明,包含:主键名称与方向、次级键名称与方向、并列处理方式、截取行数、有效样本数。这样任何人拿到这张表都能复现排序,不必猜测。
排序键本身也只是一种记录规则,不涉及对标的优劣评价。名次是排序结果,不是价值判断。
| 原始次序 | 分值 | 并列名次 | 密集名次 | 加次级键 |
|---|---|---|---|---|
| 1 | 90 | 1 | 1 | 1 |
| 2 | 80 | 2 | 2 | 2 |
| 3 | 80 | 2 | 2 | 3 |
| 4 | 80 | 2 | 2 | 4 |
| 5 | 70 | 5 | 3 | 5 |
常见误区
- 只用一个可重复的键排序,刷新后位置乱跳。
- 把并列名次与密集名次混用,前后两张表对不上。
- 截取榜单时切断并列组却不说明规则。
- 把名次解读成评价结论。
常见问题
三个同分为什么有时排 2、2、2,有时排 2、3、4?
前者是并列名次或密集名次,后者是加了唯一次级键后的稳定排序,规则不同。
怎么让榜单刷新后顺序不变?
在主排序键之外再加一个取值唯一的次级键,例如代码升序。
前 10 名为什么返回了 12 行?
可能采用了「含完整并列组」的截取方式,把与第 10 名同分的行一起带上了。