我有一个 MySQL 表,其中有两列:竞争对手和分数,在 12 个月的时间内每周编译一次。每个参赛者最多可以有 48 排,以满足每周得分的要求。 我想创建一个表格,显示每个参赛者的前 10 名分数,其列/字段如下;
竞争对手,分数1,分数2,分数3,……,分数10,分数(前10名总和)
我已经看过多个数据透视表示例,但我还没有找到一种方法来列出 10 列/字段的原始分数。
希望有人能指出我正确的方向。
我已经尝试了几个 mySQL 数据透视表示例,但它们都依赖于聚合函数,而且我无法找到一种方法来列出 10 个字段中每个竞争对手的前 10 个原始分数。
您可以使用子查询中的窗口函数来完成此操作:
WITH rankedScores AS (
SELECT
Competitor,
Score,
RANK() OVER (PARTITION BY Competitor, ORDER BY Score DESC) AS rn
FROM mytable
)
SELECT
Competitor,
MAX(IF(rn = 1, Score, NULL)) AS Score1,
MAX(IF(rn = 2, Score, NULL)) AS Score2,
MAX(IF(rn = 3, Score, NULL)) AS Score3,
MAX(IF(rn = 4, Score, NULL)) AS Score4,
MAX(IF(rn = 5, Score, NULL)) AS Score5,
MAX(IF(rn = 6, Score, NULL)) AS Score6,
MAX(IF(rn = 7, Score, NULL)) AS Score7,
MAX(IF(rn = 8, Score, NULL)) AS Score8,
MAX(IF(rn = 9, Score, NULL)) AS Score9,
MAX(IF(rn = 10, Score, NULL)) AS Score10,
SUM(IF(rn <= 10, Score, NULL)) AS ScoreTotalTop10
FROM rankedScores
GROUP BY Competitor