sql >> Database teknologi >  >> RDS >> Mysql

MySQL-gruppe efter på hinanden følgende optrædener

Forudsat at dit bord ser sådan ud :

"id";"year";"team" "1";"2000";"AAA" "2";"2001";"CCC" "3";"2002";"CCC" "4";"2003";"BBB" "5";"2004";"AAA" "6";"2005";"AAA" "7";"2006";"AAA"

Denne forespørgsel burde gøre tricket :

SELECT a.year AS start
     , MIN(c.year) AS end
     , MIN(c.year)-a.year+1 AS total
     , CONCAT_WS('-', a.year, IF(a.year = min(c.year), NULL, min(c.year))) as start_end
     , a.team
  FROM 
     ( SELECT x.year, x.team, COUNT(*) id
         FROM results x
         JOIN results y
           ON y.year <= x.year
        GROUP BY x.id
     ) AS a
  LEFT JOIN 
     ( SELECT x.year, x.team, COUNT(*) id 
         FROM results x
         JOIN results y
           ON y.year <= x.year
        GROUP BY x.id
     ) AS b ON a.id = b.id + 1 AND b.team = a.team
  LEFT JOIN  
     ( SELECT x.year, x.team, COUNT(*) id 
         FROM results x
         JOIN results y
           ON y.year <= x.year
        GROUP BY x.id
     ) AS c ON a.id <= c.id AND c.team = a.team
  LEFT JOIN 
     ( SELECT x.year, x.team, COUNT(*) id 
         FROM results x
         JOIN results y
           ON y.year <= x.year
        GROUP BY x.id
     ) AS d ON c.id = d.id - 1 AND d.team = c.team
WHERE b.id IS NULL AND c.id IS NOT NULL AND d.id IS NULL
GROUP BY start;
 

BTW Du kan muligvis finde Common Queries Tree praktisk til at løse disse problemer (tjek svarene for "Find forrige og næste værdier i en sekvens") :p.




  1. Sådan fungerer tidszone()-funktionen i PostgreSQL

  2. Når du opretter en database i MySQL med PHP ved hjælp af følgende kode, hvor laver vi forbindelsen, og hvor laver vi databasen?

  3. Java Spring REST API Håndtering af mange valgfrie parametre

  4. Kørsel af SQL Server 2014 på en Azure Virtual Machine