我有下面的 SQL 表,我们将其称为teams_score,它显示了一场比赛中由 2 名玩家组成的球队及其得分。我需要观察每个玩家每次作为玩家 1 或玩家 2 出现在团队中时的得分。我觉得这就像融化一样。
Player1, Player2, TeamScore
"Johnny Onspot", "Pat Magroin", 95
"Pepe Roni", "Cole Kutz", 78
"Ben Dover", "Ibin Yerkinoff", 76
"Johnny Onspot", "Frumunda Mabalz", 69
"Sal Lami", "Cole Kutz", 65
"Pat Magroin", "Frumunda Mabalz", 63
Run Code Online (Sandbox Code Playgroud)
我想找到平均得分最高的前 3 名玩家。
例如,“Pat Magroin”出现在 2 个团队中,得分分别为 95 和 63,平均得分为 79
所以我需要显示如下所示的表“player_score”,然后按平均分数进行聚合。如何获取下面所示的玩家得分表?
Player, Score
"Ben Dover", 76
"Cole Kutz", 78
"Cole Kutz", 65
"Frumunda Mabalz", 69
"Frumunda Mabalz", 63
"Ibin Yerkinoff", 76
"Johnny Onspot", 95
"Johnny Onspot", 69
"Pat Magroin", 95
"Pat Magroin", 63
"Pepe Roni", 78
"Sal Lami", 65
Run Code Online (Sandbox Code Playgroud)
一旦我有了player_score,我应该能够运行查询(如下所示)来获取表result_table,如下所示。
SELECT Player, AVG(Score) AS Avg_Score FROM player_score
GROUP BY Player
ORDER BY Avg_Score DESC
LIMIT 3;
Player, Avg_Score
"Johnny Onspot", 82
"Pat Magroin", 79
"Pepe Roni", 78
Run Code Online (Sandbox Code Playgroud)
SELECT *
FROM (
SELECT Player1 AS Player, TeamScore as Score
FROM teams_score
UNION ALL
SELECT Player2 AS Player, TeamScore as Score
FROM teams_score
)
Run Code Online (Sandbox Code Playgroud)
应该给
Player Score
"Johnny Onspot", 95
"Pat Magroin", 95
"Pepe Roni", 78
"Cole Kutz", 78
"Ben Dover", 76
"Ibin Yerkinoff", 76
"Johnny Onspot", 69
"Frumunda Mabalz", 69
"Sal Lami", 65
"Cole Kutz", 65
"Pat Magroin", 63
"Frumunda Mabalz", 63
Run Code Online (Sandbox Code Playgroud)
请注意使用UNION ALL(而不是仅使用UNION)来确保包含重复行。这样可以正确计算平均值。
从这里开始,您应该能够做您想做的事
WITH
...above code
AS player_score
SELECT Player, AVG(Score) AS Avg_Score
FROM player_score
GROUP BY Player
ORDER BY Avg_Score DESC
LIMIT 3;
Run Code Online (Sandbox Code Playgroud)
CREATE TABLE player_score AS SELECT Player1 AS Player, TeamScore AS Score FROM(
SELECT Player1, TeamScore
FROM teams_score
UNION ALL
SELECT Player2, TeamScore
FROM teams_score);
-- Delete duplicate rows where player and score are the same in both rows
DELETE FROM player_score WHERE rowid NOT IN
(SELECT min(rowid) FROM player_score GROUP BY Player, Score);
Run Code Online (Sandbox Code Playgroud)