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

連続出現によるMySQLグループ

    テーブルが次のようになっている場合:

    "id";"year";"team"
    "1";"2000";"AAA"
    "2";"2001";"CCC"
    "3";"2002";"CCC"
    "4";"2003";"BBB"
    "5";"2004";"AAA"
    "6";"2005";"AAA"
    "7";"2006";"AAA"
    

    このクエリでうまくいくはずです:

    SELECT a.year AS start
         , MIN(c.year) AS end
         , MIN(c.year)-a.year+1 AS total
         , CONCAT_WS('-', a.year, IF(a.year = min(c.year), NULL, min(c.year))) as start_end
         , a.team
      FROM 
         ( SELECT x.year, x.team, COUNT(*) id
             FROM results x
             JOIN results y
               ON y.year <= x.year
            GROUP BY x.id
         ) AS a
      LEFT JOIN 
         ( SELECT x.year, x.team, COUNT(*) id 
             FROM results x
             JOIN results y
               ON y.year <= x.year
            GROUP BY x.id
         ) AS b ON a.id = b.id + 1 AND b.team = a.team
      LEFT JOIN  
         ( SELECT x.year, x.team, COUNT(*) id 
             FROM results x
             JOIN results y
               ON y.year <= x.year
            GROUP BY x.id
         ) AS c ON a.id <= c.id AND c.team = a.team
      LEFT JOIN 
         ( SELECT x.year, x.team, COUNT(*) id 
             FROM results x
             JOIN results y
               ON y.year <= x.year
            GROUP BY x.id
         ) AS d ON c.id = d.id - 1 AND d.team = c.team
    WHERE b.id IS NULL AND c.id IS NOT NULL AND d.id IS NULL
    GROUP BY start;
    

    ところで、一般的なクエリツリー が見つかるかもしれません。 これらの問題を解決するのに便利です(「シーケンス内の前の値と次の値を検索する」の回答を確認してください):p。




    1. SQLで現在の合計を計算する方法

    2. Rを使用してWindowsCredVaultから資格情報を取得するときにエラーが発生する

    3. C#のプロシージャへの入力としてデータテーブルを渡す方法は?

    4. エラーが発生したため、サイトは現在オフラインです-Mautic