sql >> Databáze >  >> RDS >> Mysql

Účast na dotazu Streak MySQL

Předpokládejme, že vaše tabulka je Event a sloupce jsou EventID a Name . Pořadí (tj. 1, 2, 3 atd.), ve kterém se každý člověk účastnil událostí, můžeme určit pomocí následujícího dotazu:

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

Můžeme využít PersonalEventSequence seskupit události každé osoby do pruhů:

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

Nyní, když jsou události každé osoby seskupeny do pruhů (s nepochybně podivnými čísly StreakGroup!), můžeme určit délky pruhů každé osoby:

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

Nyní, když známe délky čar jednotlivých osob, můžeme určit délku nejdelších čar každé osoby:

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

Poznámky:

  • OP chtěl pouze aktuální pruhy (tj. pruhy, které zahrnují nejnovější událost), ale konkrétní řešení nechávám na OP, aby zjistil, protože zde uvedené obecné řešení bude použitelné pro více programátorů.
  • li>
  • Kód lze vyčistit pomocí zobrazení namísto dílčích dotazů.
  • Tento kód jsem nezkoušel spustit. Mohou tam být chyby.


  1. Zdroj Mysql je dočasně nedostupný

  2. Doktrína 2 – 2 desetinná místa na plováku?

  3. utf8mb4_unicode_ci vs utf8mb4_bin

  4. Pochopení aliasů Oracle – proč není alias v dotazu rozpoznán, pokud není zabalen do druhého dotazu?