2016-11-07 25 views
1

這個查詢SQL從列基於某個條件獲取最頻繁的價值

SELECT 
PlayerID, HeroTypeID, HeroTypeIDCount, Wins/(Losses + Wins) AS WinRate, Wins, Losses 
FROM (
    SELECT E.PlayerID AS PlayerID, 
      FK_HeroTypeID AS HeroTypeID, 
      COUNT(FK_HeroTypeID) AS HeroTypeIDCount, 
      SUM(CASE WHEN D.Result = 'LOSS' THEN 1 ELSE 0 END) AS Losses, 
      SUM(CASE WHEN D.Result = 'WIN' THEN 1 ELSE 0 END) AS Wins 
     FROM GamePlayerDetail D 
     JOIN Player E 
      ON D.FK_PlayerID = E.PlayerID 
     JOIN Game I 
       ON D.FK_GameID = I.GameID 
     WHERE PlayedDate BETWEEN DATE_SUB(CURDATE(), INTERVAL 7 DAY) AND CURDATE() 
    GROUP BY E.PlayerID, FK_HeroTypeID 
) AS T 
ORDER BY PlayerID 

產生以下結果:

# PlayerID, HeroTypeID, HeroTypeIDCount, WinRate, Wins, Losses 
'1', '11', '1', '1.0000', '1', '0' 
'1', '13', '3', '0.3333', '1', '2' 
'1', '24', '5', '0.8000', '4', '1' 
'1', '27', '1', '1.0000', '1', '0' 
'2', '28', '1', '0.0000', '0', '1' 
'2', '6', '1', '0.0000', '0', '1' 
'2', '30', '1', '0.0000', '0', '1' 
'2', '7', '1', '1.0000', '1', '0' 

我想什麼做的就是最常見的FK_HeroTypeID(這也是HeroTypeIDCount的最高值),但是在關係的情況下,最高的勝利率應該優先。這裏有一個我想要得到的例子:

PlayerID, HeroTypeID, HeroTypeIDCount, WinRate, Wins, Losses 
     1,   24,    5, 0.8000, 4,  1 
     2,   7,    1, 1.0000, 1,  0 

你應該怎麼寫這樣的查詢?

編輯:

好的,下面是一個簡單的創建/插入表的產生的結果。

http://sqlfiddle.com/#!9/d644a

+2

沒有數據集的結果集就像沒有棒棒糖的棒。見http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-query – Strawberry

+0

好吧,我已經開始編輯這個問題,並在上​​面生成的結果中包含用於創建/插入語句的sqlfiddle鏈接。 – l46kok

+0

也許我不明白,但是對於playerID 1來說,最高的勝率是11和27,而不是24.對吧? –

回答

1
SELECT playerid 
    , herotypeid 
    , herotypeidcount 
    , winrate 
    , wins 
    , losses 
    FROM 
    (SELECT * 
      , CASE WHEN @prev=playerid THEN @i:[email protected]+1 ELSE @i:=1 END rank 
      , @prev:=playerid prev 
     FROM table1 
      , (SELECT @prev:=null,@i:=0) vars 
     ORDER 
      BY herotypeidcount DESC 
      , winrate DESC 
    ) x 
WHERE rank = 1; 

這裏有一個 '黑客' 的解決方案。它的工作原理,但真的不應該依靠...

SELECT * 
    FROM 
     (SELECT * 
      FROM table1 
     ORDER 
      BY herotypeidcount DESC 
      , winrate DESC 
    ) x 
    GROUP 
    BY playerid