6

アイデアは、次の表があるとします。

-------------
| oID | Area|
-------------
| 1 | 5     |
| 2 | 2     |
| 3 | 3     |
| 5 | 3     |
| 6 | 4     |
| 7 | 5     |
-------------

連続性によるグループ化が可能な場合、この疑似クエリ

SELECT SUM(Area) FROM sample_table GROUP BY CONTINUITY(oID)

戻るだろう

-------------
| SUM(Area) |
-------------
|  10       |
|  12       |
-------------

oID で継続性の中断が発生した場合、または oID 4 を表すエントリが欠落している場合。

そのような機能は Sql の標準関数内に存在しますか?

4

2 に答える 2

5

「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に感謝する必要があります;-)

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

于 2012-03-20T13:24:00.093 に答える
0

これは、連続したデータによるグループ化に関連する非常に完全な説明と例を提供するブログ投稿です。理解または実装に問題がある場合は、問題の実装を提供することを試みることができます。

于 2012-03-20T13:20:50.283 に答える