Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Gruppieren und zählen

Sie können Folgendes verwenden:

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;

Es verwendet ROW_NUMBER, um jedes Spiel nach Team und auch nach Ergebnis zu ordnen, wobei der Unterschied zwischen diesen beiden für jede Gruppe aufeinanderfolgender Ergebnisse eindeutig ist. Für dein erstes Team hättest du also:

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

Wobei RN1 nur nach Team partitioniert ist und rn2 nach Team und Ergebnis partitioniert ist.

Wie Sie sehen können, erhöht sich die DIFF-Spalte um eins für jede Gruppe aufeinanderfolgender Siege, wenn Sie die Verluste entfernen:

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

Sie können dann danach gruppieren, um sicherzustellen, dass Sie aufeinanderfolgende Gewinne sehen, und zählen, um das Beste herauszuholen. Ich habe dann einfach eine andere Zeilennummer verwendet, um die maximalen aufeinanderfolgenden Siege pro Team zu erzielen.

Beispiel für SQL Fiddle