sql >> Databáze >  >> RDS >> Oracle

Seskupování a počítání

Můžete použít následující:

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;

Používá ROW_NUMBER k hodnocení každé hry rozdělené podle týmu a také podle výsledku, rozdíl mezi těmito dvěma je jedinečný pro každou skupinu po sobě jdoucích výsledků. Takže pro svůj první tým byste měli:

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

Kde RN1 je pouze rozdělen podle týmu a rn2 je rozdělen podle týmu a výsledku.

Jak můžete vidět, pokud odstraníte ztráty, sloupec DIFF se zvýší o jednu pro každou skupinu po sobě jdoucích vítězství:

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

Podle toho se můžete seskupit, abyste měli jistotu, že se díváte na po sobě jdoucí výhry, a spočítat, abyste získali co nejvíce. Pak jsem právě použil další číslo řádku, abych získal maximální počet po sobě jdoucích výher na tým.

Příklad na SQL Fiddle




  1. Poskytování rychlejších inovací komunitě MariaDB

  2. Problém s funkcemi a pohledy oken

  3. Proč bych měl v C# používat int místo bajtu nebo short

  4. Spouštět skripty SQL Server