Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Agrupando e contando


Você pode usar o seguinte:
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;

Ele usa ROW_NUMBER para classificar cada jogo particionado por equipe, e também por resultado, a diferença entre esses dois é única para cada grupo de resultados consecutivos. Então, para sua primeira equipe, você teria:
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

Onde RN1 é apenas particionado por equipe e rn2 é partição por equipe e resultado.

Como você pode ver, se você remover as perdas, a coluna DIFF será incrementada em um para cada grupo de vitórias consecutivas:
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

Você pode então agrupar por isso para garantir que está olhando para vitórias consecutivas e fazer uma contagem para obter o máximo. Acabei de usar outro número de linha para obter o máximo de vitórias consecutivas por equipe.

Exemplo no SQL Fiddle