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 (который также является наивысшей стоимостью HeroTypeIDCount) для PlayerID, но в случае связей наибольший winrate должен иметь приоритет. Вот пример того, что я хотел бы получить:

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

Как вы должны писать такой запрос?

Edit:

Хорошо, вот простой Создать/Вставить таблицу для производства результата.

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 для инструкции create/insert для полученного выше результата. – l46kok

+0

Может быть, я не понимаю, но для playerID 1 самый высокий winrate для 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 
Смежные вопросы