sql >> Database >  >> RDS >> Mysql

Streak MySQL-query bijwonen

Laten we aannemen dat uw tafel Event is en de kolommen zijn EventID en Name . We kunnen de volgorde bepalen (d.w.z. 1, 2, 3, enz.) waarin elke persoon evenementen bijwoonde door de volgende vraag:

SELECT
  e1.Name, e1.EventID, COUNT(*) AS PersonalEventSequence
FROM
  Event e1
    INNER JOIN
  Event e2
    ON e1.Name = e2.Name AND e1.EventID >= e2.EventID
GROUP BY
  e1.Name, e1.EventID

We kunnen gebruik maken van PersonalEventSequence om de gebeurtenissen van elke persoon in strepen te groeperen:

SELECT
  Name, EventID - PersonalEventSequence AS StreakGroup
FROM
  (
    SELECT
      e1.Name, e1.EventID, COUNT(*) AS PersonalEventSequence
    FROM
      Event e1
        INNER JOIN
      Event e2
        ON e1.Name = e2.Name AND e1.EventID >= e2.EventID
    GROUP BY
      e1.Name, e1.EventID
  ) AS SubQuery1

Nu de gebeurtenissen van elke persoon zijn gegroepeerd in strepen (met weliswaar rare StreakGroup-nummers!), kunnen we de lengte van de strepen van elke persoon bepalen:

SELECT
  Name, StreakGroup, COUNT(*) AS StreakLength
FROM
  (
    SELECT
      Name, EventID - PersonalEventSequence AS StreakGroup
    FROM
      (
        SELECT
          e1.Name, e1.EventID, COUNT(*) AS PersonalEventSequence
        FROM
          Event e1
            INNER JOIN
          Event e2
            ON e1.Name = e2.Name AND e1.EventID >= e2.EventID
        GROUP BY
          e1.Name, e1.EventID
      ) AS SubQuery1
  ) SubQuery2
GROUP BY
  Name, StreakGroup

Nu we de lengte van de streaks van elke persoon kennen, kunnen we de lengte van de langste streak van elke persoon bepalen:

SELECT
  Name, MAX(StreakLength) AS PersonalRecordStreakLength
FROM
  (
    SELECT
      Name, StreakGroup, COUNT(*) AS StreakLength
    FROM
      (
        SELECT
          Name, EventID - PersonalEventSequence AS StreakGroup
        FROM
          (
            SELECT
              e1.Name, e1.EventID, COUNT(*) AS PersonalEventSequence
            FROM
              Event e1
                INNER JOIN
              Event e2
                ON e1.Name = e2.Name AND e1.EventID >= e2.EventID
            GROUP BY
              e1.Name, e1.EventID
          ) AS SubQuery1
      ) SubQuery2
    GROUP BY
      Name, StreakGroup
  ) SubQuery3
GROUP BY
  Name

Opmerkingen:

  • De OP wilde alleen huidige strepen (d.w.z. strepen die de laatste gebeurtenis bevatten), maar ik laat die specifieke oplossing over aan de OP om erachter te komen, aangezien de algemene oplossing die hier wordt getoond van toepassing zal zijn op meer programmeurs.
  • li>
  • De code kan worden opgeschoond door Views te gebruiken in plaats van subquery's.
  • Ik heb niet geprobeerd deze code uit te voeren. Er kunnen fouten zijn.


  1. MySQL SELECTEER DISTINCT meerdere kolommen

  2. hoe te controleren of mysql-query geen resultaat oplevert (record niet gevonden) met php?

  3. Waarschuwing:mysql_fetch_array():opgegeven argument is geen geldige MySQL-resultaatbron

  4. Hoe brengt u SQL Server 2005-gegevens over naar of exporteert u deze naar Excel?