sql >> Database teknologi >  >> RDS >> Oracle

Gruppering og optælling

Du kan bruge følgende:

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 bruger ROW_NUMBER til at rangere hvert spil opdelt efter hold, og også efter resultat, forskellen mellem disse to er unik for hver gruppe af på hinanden følgende resultater. Så for dit første hold ville du have:

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

Hvor RN1 bare er opdelt efter hold, og rn2 er partition efter hold og resultat.

Som du kan se, hvis du fjerner tabene, øges DIFF-kolonnen med én for hver gruppe af på hinanden følgende sejre:

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 derefter gruppere efter dette for at sikre, at du ser på fortløbende sejre, og foretage en optælling for at få mest muligt. Jeg har så lige brugt et andet rækkenummer for at få de maksimale på hinanden følgende sejre pr. hold.

Eksempel på SQL Fiddle




  1. 3 måder at tælle antallet af systemtabeller i en SQL Server-database

  2. Hvordan kan jeg få de unikke karakterer fra en streng i Oracle?

  3. Gem billede til database blob; hent fra db til Picturebox

  4. Arbejde med MyISAM i MySQL