Mysql
 sql >> Baza danych >  >> RDS >> Mysql

SQL GROUP BY:interwały w ciągłości?

Nie ma takiej funkcjonalności w "standardowych funkcjach SQL", ale możliwe jest uzyskanie pożądanego zestawu wyników za pomocą kilku sztuczek.

Za pomocą podzapytania przedstawionego poniżej tworzymy wirtualne pole, którego możesz użyć do GROUP BY w zewnętrznym zapytaniu. Wartość tego wirtualnego pola jest zwiększana za każdym razem, gdy występuje przerwa w sekwencji oID . W ten sposób tworzymy identyfikator dla każdej z tych „wysp danych”:

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

Tabela testowa i generowanie danych:

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);

Muszę podziękować Quassnoi za wskazanie tej sztuczki w moje powiązane pytanie ;-)

AKTUALIZACJA:dodano tabelę testową i dane oraz naprawiono zduplikowaną nazwę kolumny w przykładowym zapytaniu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Połącz dwie kolumny z dwóch tabel w jedną

  2. PHP i MySQL:Konwersja zapisanego ZNACZNIKA CZASOWEGO na lokalną strefę czasową użytkownika

  3. Kolejne sporządzone oświadczenie dobre praktyki

  4. Funkcja MySQL MOD() – Wykonaj operację Modulo w MySQL

  5. Oświadczenie o usunięciu Mysql z limitem