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;