【问题标题】:Create ranking within set of rows resulting from GROUP BY在 GROUP BY 产生的行集中创建排名
【发布时间】:2023-01-21 09:36:33
【问题描述】:

我有下表

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

对于单个 tournament / year / round-组合,使用以下数据示例。

1  33  2016  895  1  20  
2  33  2016  895  1  10
3  33  2016  895  1  25
4  33  2016  895  1  28
7  33  2016  895  1  25
8  33  2016  895  1  17
9  33  2016  895  1  12

我想创建一个名为 ranking 的新列,代表特定 tournament / year / round 组合的玩家排名。得分最高的玩家是#1。如果玩家得分相同,则他们并列需要用“T”指定。

所需的输出如下所示:

1  33  2016  895  1  20  3
2  33  2016  895  1  12  T5 
3  33  2016  895  1  25  T2
4  33  2016  895  1  28  1 
7  33  2016  895  1  25  T2
8  33  2016  895  1  17  4
9  33  2016  895  1  12  T5

我怎样才能实现上述目标?谢谢

【问题讨论】:

    标签: python sqlite count window-functions dense-rank


    【解决方案1】:

    使用DENSE_RANK()窗口函数进行排名,COUNT()窗口函数检查是否需要在开始时连接'T'

    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 子句中删除。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-18
      • 2018-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      相关资源
      最近更新 更多