簡體   English   中英

SQL - 如何計算每個玩家的獲勝次數

[英]SQL - How to count the number of wins for each player

我是學習 SQL 的新手,想知道如何從 Khanacademy 對這些數據進行排序。 我想做的是顯示每個玩家的獲勝次數。 到目前為止,我已經能夠顯示每個玩家參加的每場比賽的數量,並顯示每場比賽的獲勝者。 但是,我想計算每個玩家的勝利次數。

有經驗的人可以檢查查詢並幫助指導我嗎?

CREATE TABLE card_games(id INTEGER PRIMARY KEY AUTOINCREMENT,
    date_played TEXT,
    game_name TEXT,
    player_name TEXT,
    score INTEGER);

INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/01/07','Rummy','Spunky Sam',226);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/01/07','Rummy','Marcimus',418);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/01/07','Rummy','Winston',523);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/01/07','Rummy','Hopper',311);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/01/14','Go Fish','Spunky Sam',7);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/01/14','Go Fish','Marcimus',5);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/01/14','Go Fish','Winston',4);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/01/14','Go Fish','Hopper',10);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/01/14','Crazy Eights','Spunky Sam',215);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/01/14','Crazy Eights','Marcimus',167);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/01/14','Crazy Eights','Winston',109);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/01/14','Crazy Eights','Hopper',192);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/01/21','Rummy','Spunky Sam',473);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/01/21','Rummy','Marcimus',324);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/01/21','Rummy','Hopper',516);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/01/28','Crazy Eights','Spunky Sam',119);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/01/28','Crazy Eights','Marcimus',212);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/01/28','Crazy Eights','Purple Pi',314);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/01/28','Crazy Eights','Hopper',252);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/02/04','Go Fish','Spunky Sam',3);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/02/04','Go Fish','Marcimus',11);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/02/04','Go Fish','Winston',12);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/02/04','Go Fish','Hopper',0);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/02/04','Pitch','Spunky Sam',17);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/02/04','Pitch','Marcimus',22);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/02/04','Pitch','Winston',-3);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/02/04','Pitch','Hopper',9);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/02/11','Rummy','Amelia',525);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/02/11','Rummy','Marcimus',419);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/02/11','Rummy','Winston',316);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/02/11','Rummy','Hopper',398);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/02/18','Crazy Eights','Spunky Sam',119);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/02/18','Crazy Eights','Marcimus',231);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/02/18','Crazy Eights','Winston',153);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/02/18','Crazy Eights','Hopper',175);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/02/25','Pitch','Spunky Sam',12);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/02/25','Pitch','Marcimus',6);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/02/25','Pitch','Winston',21);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/02/25','Go Fish','Spunky Sam',6);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/02/25','Go Fish','Marcimus',7);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/02/25','Go Fish','Winston',13);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/03/04','Rummy','Spunky Sam',378);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/03/04','Rummy','Marcimus',327);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/03/04','Rummy','Winston',413);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/03/04','Rummy','Hopper',517);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/03/11','Pitch','Spunky Sam',-1);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/03/11','Pitch','Marcimus',-5);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/03/11','Pitch','Winston',7);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/03/11','Pitch','Hopper',22);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/03/18','Crazy Eights','Spunky Sam',91);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/03/18','Crazy Eights','Marcimus',153);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/03/18','Crazy Eights','Amelia',174);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/03/18','Crazy Eights','Mr. Pink',216);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/03/25','Rummy','Spunky Sam',416);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/03/25','Rummy','Marcimus',505);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/03/25','Rummy','Winston',397);
INSERT INTO card_games(date_played,game_name,player_name,score) VALUES ('2015/03/25','Rummy','Hopper',443);

SELECT * FROM card_games;

SELECT player_name,
SUM(CASE
WHEN player_name = "Spunky Sam" THEN 1 
WHEN player_name = "Marcimus" THEN 1
WHEN player_name = "Amelia" THEN 1
WHEN player_name = "Hopper" THEN 1
WHEN player_name = "Mr. Pink" THEN 1
WHEN player_name = "Purple Pi" THEN 1
WHEN player_name = "Winston" THEN 1
END) AS "GamesPlayed"
FROM card_games
GROUP BY player_name;

SELECT date_played, game_name,player_name AS "Winner", MAX(score)
FROM card_games
GROUP BY date_played, game_name

您可以使用 CTE 實現您的解決方案。 這是代碼

with cte1 as(
  SELECT date_played, game_name,player_name AS Winner, MAX(score)
  FROM card_games
  GROUP BY date_played, game_name,player_name
     )
     select winner,count(1) from cte1
     group by winner

我對您發布的代碼有一些問題,所以我創建了一個 SQL Fiddle 來處理它,並進行一些細微的語法更改。 我懷疑您實際上可能在 MySQL 工作,但我已將此代碼轉換為 MSSQL(Microsoft SQL),對此感到抱歉。 但邏輯保持不變。

所以,是的。 當您進入聚合函數時,您會開始發現獲取多個數據作為聚合的一部分會很快變得棘手。

有幾件事我們可以做,沒有一件像你迄今為止看到的可汗學院樣本那樣容易,因為問題的關鍵是我們需要 (1) 通過獲得最高分和 (2) 確定來自“獲勝”記錄的其他字段。

(Khanacademy 對他們向您展示的內容非常小心,以免讓您太快到達這個地方,因為事情會變得很匆忙)。

假設我們通過連接來執行此操作(這里是 SQL Fiddle http://sqlfiddle.com/#!18/5b8f4/10 ):

-- now for each of the winning game records (showing 1 record per player), now we can just tally them up
SELECT player_name, count(player_name) as GamesWon
FROM
(
  -- here, we join our card_games table to the winning scores to get just those lines via an inner join
  SELECT played.date_played, played.game_name, played.player_name, played.score, winScores.topscore
  FROM card_games as played
  INNER JOIN 
  (
    -- for each game, find out what the top score was
    SELECT date_played, game_name, MAX(score) as topscore
    FROM card_games
    GROUP BY date_played, game_name
  ) as winScores on winScores.date_played=played.date_played and winScores.game_name=played.game_name and winScores.topscore=played.score
) as gamesWon
GROUP BY player_name

我們還可以使用 row_count 和分區來做更復雜的事情,就像這樣(sql fiddle http://sqlfiddle.com/#!18/5b8f4/14 ):

-- now for each of the winning game records (showing 1 record per player), now we can just tally them up
SELECT player_name, count(player_name) as GamesWon
FROM
(

  -- let's use the row_number to assign an int, 1,2,3,4, ... etc according to the highest score down
  -- and we will do this (partition by) for each unique date_played-to-game_name combination
  SELECT 
    card_games.*,
    ROW_NUMBER() OVER(PARTITION BY date_played, game_name ORDER BY score DESC) AS [Score Ranking]
  FROM card_games

) as gamesWon
WHERE [Score Ranking]=1
GROUP BY player_name

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM