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

SQL GROUP BY:連続性の間隔?

    「SQLの標準関数」にはそのような機能はありませんが、いくつかのトリックを使用して目的の結果セットを取得することは可能です。

    以下に示すサブクエリを使用して、GROUP BYに使用できる仮想フィールドを作成します。 外側のクエリで。この仮想フィールドの値は、oIDのシーケンスにギャップがあるたびに増分されます 。このようにして、これらの「データアイランド」ごとに識別子を作成します。

    SELECT  SUM(Area), COUNT(*) AS Count_Rows
    FROM    (
            /* @group_enumerator is incremented each time there is a gap in oIDs continuity */
            SELECT  @group_enumerator := @group_enumerator + (@prev_oID != oID - 1) AS group_enumerator,
                    @prev_oID := oID AS prev_oID,
                    sample_table.*
            FROM    (
                    SELECT  @group_enumerator := 0,
                            @prev_oID := -1
                    ) vars,
                    sample_table
            /* correct order is very important */
            ORDER BY
                    oID
            ) q
    GROUP BY
            group_enumerator
    

    テストテーブルとデータ生成:

    CREATE TABLE sample_table (oID INT auto_increment, Area INT, PRIMARY KEY(oID));
    INSERT INTO sample_table (oID, Area) VALUES (1,5), (2,2), (3,3), (5,3), (6,4), (7,5);
    

    このトリックを指摘してくれたQuassnoiに感謝する必要があります。私の関連する質問 ;-)

    更新:テストテーブルとデータを追加し、クエリ例の重複する列名を修正しました。



    1. MySQLデータベースの単一のテーブルのバックアップを取る方法は?

    2. きめ細かいアクセス制御

    3. ActiveRecordを使用してmysqlでDISTINCTONを使用する方法

    4. ストアドプロシージャで動的SQLを使用するための回避策は何ですか