SQL GROUP BY: интервалы в непрерывности? - PullRequest
6 голосов
/ 20 марта 2012

Идея состоит в том, что, скажем, у вас есть следующая таблица.

-------------
| 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?

Ответы [ 2 ]

5 голосов
/ 20 марта 2012

В «стандартных функциях 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 за указание этот трюк в моем связанном вопросе ; -)

ОБНОВЛЕНИЕ: добавлены тестовая таблица и данные и исправлено повторяющееся имя столбца в примере запроса.

0 голосов
/ 20 марта 2012

Вот запись в блоге, которая содержит очень подробное объяснение и пример, связанный с группировкой по непрерывным данным .Если у вас есть какие-либо проблемы с пониманием или реализацией, я могу попытаться обеспечить реализацию вашей проблемы.

...