Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Teilnehmende Streak MySQL-Abfrage

Nehmen wir an, Ihre Tabelle ist Event und die Spalten sind EventID und Name . Wir können die Reihenfolge (d. h. 1, 2, 3 usw.) ermitteln, in der jede Person an Veranstaltungen teilgenommen hat, indem wir die folgende Abfrage ausführen:

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

Wir können PersonalEventSequence nutzen um die Ereignisse jeder Person in Streaks zu gruppieren:

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

Nun, da die Ereignisse jeder Person in Streaks gruppiert sind (mit zugegebenermaßen seltsamen StreakGroup-Nummern!), können wir die Länge der Streaks jeder Person bestimmen:

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

Da wir nun die Länge der Strähnen jeder Person kennen, können wir die Länge der längsten Strähnen jeder Person bestimmen:

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

Hinweise:

  • Das OP wollte nur aktuelle Streaks (d. h. Streaks, die das neueste Ereignis enthalten), aber ich überlasse es dem OP, diese spezifische Lösung herauszufinden, da die hier gezeigte allgemeine Lösung auf mehr Programmierer anwendbar sein wird.
  • li>
  • Der Code könnte bereinigt werden, indem Ansichten anstelle von Unterabfragen verwendet werden.
  • Ich habe nicht versucht, diesen Code auszuführen. Es könnten Fehler auftreten.