2016-11-07 2 views
1

Diese AbfrageSQL Erhalten häufigster Wert aus einer Spalte auf der Grundlage einer Bedingung

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 

erzeugt das folgende Ergebnis:

# 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' 

Was ich zu tun ist, möchte die häufigste FK_HeroTypeID bekommen (Dies ist auch der höchste Wert von HeroTypeIDCount) pro PlayerID, aber im Falle von Bindungen sollte die höchste Winrate Vorrang haben. Hier ist ein Beispiel für das, was ich gerne bekommen würde:

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

Wie sollten Sie eine Abfrage wie diese schreiben?

Edit:

Ok, hier ist eine einfache Erstellen/Insert-Tabelle für das produzierte Ergebnis.

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

+2

Ein Ergebnis ohne einen Datensatz ist wie ein Stock ohne einen Lutscher. Siehe http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-very-simple-sql-query – Strawberry

+0

In Ordnung, ich habe die Frage bearbeitet und die sqlfiddle-Verknüpfung für die create/insert-Anweisung für das oben erzeugte Ergebnis eingefügt. – l46kok

+0

Vielleicht verstehe ich nicht, aber für playerID 1 ist die höchste Winrate für 11 und 27, nicht 24. Richtig? –

Antwort

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; 

Hier ist ein 'Hack' Lösung. Es funktioniert, aber sollte wirklich nicht verlässlich sein ...

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