W SQL Server 2022 dostarczono nową funkcję, a GENERATE_SERIES() , która była przez wielu długo oczekiwana. Ta funkcja pozwoli wygenerować serię liczb w zadanym przedziale. Zakres i skok między wartościami szeregów są definiowane przez użytkownika.

GENERATE_SERIES wymaga poziomu zgodności co najmniej 160. Gdy poziom zgodności jest mniejszy niż 160, SQL Server nie może znaleźć funkcji GENERATE_SERIES.

Poniżej podano zapytanie o zmianę poziomu zgodności bazy danych

	ALTER DATABASE tempdb SET COMPATIBILITY_LEVEL = 160

Składnia:

GENERATE_SERIES ( star, stop [, step ] )

Argumenty:

start

Pierwsza wartość w przedziale. start jest określony jako zmienna, literał lub wyrażenie skalarne typu tinyint , smallint , int , bigint , decimal lub numeric .

stop

Ostatnia wartość w przedziale. stop jest określony jako zmienna, literał lub wyrażenie skalarne typu tinyint , smallint , int , bigint , decimal lub numeric . Seria zatrzymuje się, gdy ostatnia wygenerowana wartość kroku przekroczy wartość zatrzymania .

Typ danych dla stop musi być zgodny z typem danych dla start .

[ krok ]

Wskazuje liczbę wartości do zwiększenia lub zmniejszenia między krokami w serii. step jest wyrażeniem typu tinyint , smallint , int , bigint , decimal lub numeric . krok może być ujemny lub dodatni, ale nie może wynosić zero (0).

Ten argument jest opcjonalny. Domyślną wartością kroku jest 1, jeśli start jest mniejszy niż stop , w przeciwnym razie domyślną wartością jest -1, jeśli start jest większy niż stop .

Jeśli start jest mniejszy niż stop i określono wartość ujemną dla step , lub jeśli start jest większy niż stop i określono wartość dodatnią dla step , zwracany jest pusty zestaw wyników.

Poniżej przykład zastosowania:

SELECT value FROM GENERATE_SERIES(1, 5);     -- 1, 2, 3, 4, 5
SELECT value FROM GENERATE_SERIES(2, 10, 2); -- 2, 4, 6, 8, 10
SELECT value FROM GENERATE_SERIES(5, 1,-1); -- 5, 4, 3, 2, 1

Zwracane typy

Zwraca jednokolumnową tabelę zawierającą sekwencję wartości, z których każda różni się od poprzedniej o krok . Nazwa kolumny to value. Wyjście jest tego samego typu co start i stop .

A jak zwrócić serię danych dla dat ?

Podczas analizowania danych szeregów czasowych często tworzy się zestaw wartości typu data/godzina w równych odstępach czasu (na przykład co minutę) w określonym zakresie. Jednym ze sposobów osiągnięcia tego jest utworzenie tabeli liczb, która zawiera zestaw kolejnych liczb między dolną a górną granicą. Liczb w tabeli można następnie użyć w połączeniu z funkcją DATEADD do utworzenia zakresu wartości daty/godziny

SELECT DATEADD(minute, i.value, '2023-01-06 13:00') AS [interval]
FROM GENERATE_SERIES(0, 59, 1) AS i;


Dariusz Brejnak

Od prawie trzydziestu lat jest pasjonatem informatyki, a zwłaszcza dziedzin dotyczących baz danych, hurtowni danych oraz ogólnie rozumianej tematyki BI. Jego druga pasja to fotografia http://dariuszbrejnak.pl