Oracle
 sql >> Base de données >  >> RDS >> Oracle

Grouper et compter

Vous pouvez utiliser les éléments suivants :

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;

Il utilise ROW_NUMBER pour classer chaque match partitionné par équipe, et aussi par résultat, la différence entre ces deux est unique pour chaque groupe de résultats consécutifs. Donc, pour votre première équipe, vous auriez :

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

Où RN1 est juste partitionné par équipe, et rn2 est partitionné par équipe et résultat.

Comme vous pouvez le voir, si vous supprimez les pertes, la colonne DIFF s'incrémente de un pour chaque groupe de victoires consécutives :

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

Vous pouvez ensuite regrouper par ceci pour vous assurer que vous regardez des victoires consécutives et faire un décompte pour en tirer le meilleur parti. J'ai ensuite utilisé un autre numéro de ligne pour obtenir le maximum de victoires consécutives par équipe.

Exemple sur SQL Fiddle