sql >> データベース >  >> RDS >> Mysql

ストリークMySQLクエリに参加する

    テーブルが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
    

    注:

    • OPは現在のストリーク(つまり、最新のイベントを含むストリーク)のみを望んでいましたが、ここに示す一般的なソリューションはより多くのプログラマーに適用できるため、その特定のソリューションはOPに任せています。
    • サブクエリの代わりにビューを使用してコードをクリーンアップできます。
    • このコードを実行しようとしたことはありません。エラーが発生する可能性があります。


    1. 変数が値phpに等しい場合

    2. 存在しないデータに対して空の行を返す

    3. PostgreSQLタイムスタンプタイプでタイムゾーンを保持する

    4. PostgreSQLのフォールトトレランスの進化