sql >> Databasteknik >  >> RDS >> Mysql

Deltar i Streak MySQL Query

Låt oss anta att din tabell är Event och kolumnerna är EventID och Name . Vi kan bestämma sekvensen (dvs. 1, 2, 3, etc.) i vilken varje person deltog i evenemang genom följande fråga:

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

Vi kan utnyttja PersonalEventSequence för att gruppera varje persons händelser i streck:

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 när varje persons händelser är grupperade i streak (med visserligen konstiga StreakGroup-nummer!), kan vi bestämma längden på varje persons streak:

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 när vi vet längden på varje persons streck, kan vi bestämma längden på varje persons längsta rad:

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

Anmärkningar:

  • OP ville bara ha aktuella streaks (d.v.s. streaks som inkluderar den senaste händelsen), men jag överlåter den specifika lösningen till OP att ta reda på eftersom den allmänna lösningen som visas här kommer att vara tillämplig på fler programmerare.
  • Koden kan rensas genom att använda Views istället för underfrågor.
  • Jag har inte provat att köra den här koden. Det kan finnas fel.


  1. hur startar man en app med SQLite darabase på Android Studio-emulatorn?

  2. Varning:PDO::exec() förväntar sig att parameter 1 är sträng

  3. GROUP BY utan aggregatfunktion

  4. MySQL skriver på en textfil