sql >> Databasteknik >  >> RDS >> Oracle

Gruppering och räkning

Du kan använda följande:

SELECT  Team, TotalWins, FirstWin, LastWin
FROM    (   SELECT  Team, 
                    WL,
                    COUNT(*) TotalWins,
                    MIN("Date") FirstWin,
                    MAX("Date") LastWin,
                    ROW_NUMBER() OVER(PARTITION BY Team, WL ORDER BY COUNT(*) DESC) RowNumber
            FROM    (   SELECT  Team,
                                "Date",
                                WL, 
                                ROW_NUMBER() OVER(PARTITION BY Team ORDER BY "Date") - ROW_NUMBER() OVER(PARTITION BY Team, WL ORDER BY "Date") Grouping
                        FROM    T
                    ) GroupedData
            WHERE   WL = 'W'
            GROUP BY Team, WL, Grouping
        ) RankedData
WHERE   RowNumber = 1;

Den använder ROW_NUMBER för att rangordna varje spel uppdelat efter lag, och även efter resultat, skillnaden mellan dessa två är unik för varje grupp av på varandra följande resultat. Så för ditt första lag skulle du ha:

Team    Date        W/L RN1     RN2 DIFF
Team_1  04/01/0012  W   1       1   0
Team_1  06/01/0012  W   2       2   0
Team_1  07/01/0012  L   3       1   2
Team_1  14/01/0012  W   4       3   1
Team_1  19/01/0012  W   5       4   1
Team_1  30/01/0012  L   6       2   4
Team_1  14/02/0012  W   7       5   2
Team_1  17/02/0012  L   8       3   5
Team_1  20/02/0012  W   9       6   3

Där RN1 bara är uppdelad efter lag och rn2 är partition efter lag och resultat.

Som du kan se, om du tar bort förlusterna ökar DIFF-kolumnen med en för varje grupp av på varandra följande segrar:

Team    Date        W/L RN1     RN2 DIFF
Team_1  04/01/0012  W   1       1   0
Team_1  06/01/0012  W   2       2   0
---------------------------------------
Team_1  14/01/0012  W   4       3   1
Team_1  19/01/0012  W   5       4   1
---------------------------------------
Team_1  14/02/0012  W   7       5   2
---------------------------------------
Team_1  20/02/0012  W   9       6   3

Du kan sedan gruppera efter detta för att säkerställa att du tittar på vinster i följd, och räkna för att få ut det mesta. Jag har sedan bara använt ett annat radnummer för att få maximala på varandra följande vinster per lag.

Exempel på SQL Fiddle




  1. Google Maps API v3 kryssruta / filterdatabas

  2. SQL Server 2008 Tom sträng mot utrymme

  3. Felsök ett fel när du försöker skapa en stor IMDB-modell

  4. Infoga text från textarea i MySQL-databasen utan att förlora formatering