Mysql
 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mysql достъп до основната таблица вътре в дясно присъединена подзаявка

  2. Cloud 9 IDE не може да се свърже с база данни

  3. Най-добра практика за PHP/MySQL система за назначаване/резервиране

  4. MySQL, Грешка 126:Неправилен ключов файл за таблица

  5. INSERT IGNORE или INSERT WHERE NIGHT IN