Mysql
 sql >> база данни >  >> RDS >> Mysql

Посещение на Streak MySQL Query

Да приемем, че вашата таблица е Event и колоните са EventID и Name . Можем да определим последователността (т.е. 1, 2, 3 и т.н.), в която всеки човек е присъствал на събития чрез следната заявка:

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

Можем да използваме PersonalEventSequence за групиране на събитията на всеки човек в ивици:

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

Сега, когато събитията на всеки човек са групирани в ивици (признато, че имат странни номера на StreakGroup!), можем да определим дължините на лентите на всеки човек:

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

Сега, когато знаем дължините на лентите на всеки човек, можем да определим дължината на най-дългата ивица на всеки човек:

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

Бележки:

  • ОП искаше само текущи поредици (т.е. ленти, които включват най-новото събитие), но оставям това конкретно решение на ОП да разбере, тъй като общото решение, показано тук, ще бъде приложимо за повече програмисти.
  • Кодът може да бъде почистен чрез използване на Views вместо подзаявки.
  • Не съм опитвал да стартирам този код. Възможно е да има грешки.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysql избере int като валута или преобразува int във валутен формат?

  2. MySQL многоколонен първичен ключ

  3. Каква е по-добрата стратегия за съхраняване на регистрационни данни в база данни?

  4. Плъзгаща се средна - MySQL

  5. Изберете последния запис от дясната таблица, когато използвате присъединяване в mysql