sqlite 在GROUP BY生成的行集中创建排名

4xrmg8kj  于 2023-01-21  发布在  SQLite
关注(0)|答案(1)|浏览(156)

我有下表

CREATE TABLE "results" (
    "player"    INTEGER,
    "tournament"    INTEGER,
    "year"  INTEGER,
    "course"    INTEGER,
    "round" INTEGER,
    "score" INTEGER,
);

以下是单个tournament/year/round组合的数据样本。
我想创建一个名为ranking的新列,它代表特定tournament/year/round组合的玩家排名。得分最多的玩家是#1。如果玩家得分相同,他们将打成平手,需要用“T”指定。
所需的输出如下所示:
我怎样才能达到以上目的?谢谢

pvabu6sv

pvabu6sv1#

使用DENSE_RANK()窗口函数进行排序,如果需要在开始时连接'T',则使用COUNT()窗口函数检查:

SELECT *,
       CASE WHEN COUNT(*) OVER (PARTITION BY tournament, year, course, round, score) > 1 THEN 'T' ELSE '' END ||
       DENSE_RANK() OVER (PARTITION BY tournament, year, course, round ORDER BY score DESC) AS ranking
FROM results
ORDER BY player;

请参见demo
如果course对该排名不重要,则将其从两个PARTITION BY子句中删除。

相关问题