2016-11-07 6 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を取得していますこれはまた、PlayerIDごとにHeroTypeIDCountの最高値ですが、ネクタイの場合は、最高の勝利が優先されます。ここに私が得たいものの例があります:

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

あなたはどのようにこのようなクエリを書くべきですか?

編集:

[OK]を、ここで生成される結果のための簡単な作成/挿入テーブルです。

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

申し訳ありませんが、先に作成した結果に対してcreate/insert文のsqlfiddleリンクを含めるように質問を編集しました。 – l46kok

+0

私は理解できないかもしれませんが、playerID 1の場合、最高の勝利は24でなく11と27です。 –

答えて

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