sqlite ROW_NUMBER、RANK或DENSE_RANK具有相同的顺序编号(如果存在具有相同值的行

tyg4sfes  于 2022-12-13  发布在  SQLite
关注(0)|答案(2)|浏览(243)
  • 问题 * 用位置号、球员名字和最佳得分组成一个记分牌。如果两个球员得分相同,他们共享位置,名字按字母顺序排列。(见示例。)

我有两张table
第一个
预期结果为:
| 订单|名称名称名称|得分|
| - -|- -|- -|
| 一个|利萨|二百|
| 一个|迈娅|二百|
| 三个|卡莱皮|100个|
| 三个|乌莱维|100个|
| 五个|科蒂瓦洛|五十个|
仔细查看订单号。因为有2行订单号为1,所以下一个订单号将是3,而不是2

nfs0ujit

nfs0ujit1#

下面是一个可能的解决方案:

WITH
    places AS (
        SELECT row_number() OVER (ORDER BY score DESC, name) AS place, name, score
        FROM players
        JOIN results ON players.id = results.player_id
    )
SELECT first_value(place) OVER (PARTITION BY score ORDER BY place) AS place, name, score
FROM places ORDER BY score DESC, name;

请参阅fiddle

aiqt4smr

aiqt4smr2#

如果出现并列,则需要rank()来保持排名。如果不需要在排名之间设置间隔,则需要dense_rank()。

select rank() over (order by r.score desc)       as order1,
       dense_rank() over (order by r.score desc) as order2,
       p.name,
       r.score
  from players p
  join results r
    on p.id = r.player_id
 order by r.score desc, p.name;

结果(包括rank()和dense_rank()以供参考)。

| order1 | order2 | name      | score |
+--------+--------+-----------+-------+
| 1      | 1      | Liisa     |   200 |
| 1      | 1      | Maija     |   200 |
| 3      | 2      | Kaaleppi  |   100 |
| 3      | 2      | Uolevi    |   100 |
| 5      | 3      | Kotivalo  |    50 |

相关问题