В этом руководстве вы узнаете, как использовать функцию SQL Server GENERATE_SERIES() для генерации последовательности чисел в определенном диапазоне.
Введение в функцию SQL Server GENERATE_SERIES()
Функция GENERATE_SERIES() позволяет создать серию значений в указанном диапазоне.
Вот синтаксис функции GENERATE_SERIES():
GENERATE_SERIES(start, stop [, step])
В этом синтаксисе:
- начало: Начальное значение ряда.
- stop: Конечное значение серии. Серия останавливается, когда последнее сгенерированное значение шага превышает значение остановки.
- шаг: Значение приращения или убывания между шагами в серии. Шаг может быть как положительным, так и отрицательным, но не может быть нулевым.
Параметры start, stop и step могут быть литералом, переменной или скалярным выражением типа integer(tinyint, smallint, int и bigint) или decimal(или numeric). Они также должны иметь одинаковый тип данных.
Если начало меньше конца, шаг будет иметь значение по умолчанию 1. В противном случае значение шага по умолчанию будет равно -1.
Функция GENERATE_SERIES() возвращает результирующий набор, состоящий из одного столбца с именем «value».
Функция GENERATE_SERIES() возвращает пустой набор результатов в следующих случаях:
- Если старт меньше стопа, а шаг имеет отрицательное значение.
- Если старт больше стопа, а шаг имеет положительное значение.
- Если начало, конец или шаг равны NULL.
В PostgreSQL функция GENERATE_SERIES() генерирует ряд значений, включая числа, даты и временные метки. Однако в SQL Server функция GENERATE_SERIES() может создавать только ряд чисел.
Примеры функции SQL Server GENERATE_SERIES()
Давайте рассмотрим несколько примеров использования функции GENERATE_SERIES().
1) Примеры базовой функции GENERATE_SERIES()
В следующем примере функция GENERATE_SERIES() используется для генерации серии целых чисел от 1 до 5 с шагом 1:
SELECT value FROM GENERATE_SERIES(1,5);
Выход:
value ----------- 1 2 3 4 5 (5 rows affected)
В следующем примере функция GENERATE_SERIES() используется для генерации серии целых чисел от 1 до 10 с шагом 2:
SELECT value FROM GENERATE_SERIES(1,10,2);
Выход:
value ----- 1 3 5 7 9 (5 rows affected)
Следующий оператор использует функцию GENERATE_SERIES() для генерации ряда целых чисел от 10 до 1 с шагом 2:
SELECT value FROM GENERATE_SERIES(10,1,-2);
Выход:
value ------ 10 8 6 4 2 (5 rows affected)
Следующий оператор использует функцию GENERATE_SERIES() для генерации серии десятичных значений от 1 до 2 с шагом 0,1:
SELECT value FROM GENERATE_SERIES(1.0,2.0,0.1);
Выход:
value ------ 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0 (11 rows affected)
2) Использование функции GENERATE_SERIES() для ряда дат
В следующем примере функция GENERATE_SERIES() используется для генерации серии из 7 значений дат, начиная с 01.04.2024:
SELECT CONVERT(DATE, DATEADD(DAY, VALUE, '2024-04-01')) AS DATE FROM GENERATE_SERIES(0, 6);
Выход:
Date ---------- 2024-04-01 2024-04-02 2024-04-03 2024-04-04 2024-04-05 2024-04-06 2024-04-07 (7 rows affected)
Как это работает.
- Сначала сгенерируйте ряд целых чисел от 0 до 6 с помощью функции GENERATE_SERIES(). Эти числа представляют собой количество дней, которые мы добавляем к начальной дате('2024-04-01').
- Во-вторых, для каждого числа, сгенерированного функцией GENERATE_SERIES(), добавьте соответствующее количество дней к начальной дате(«2024-04-01») с помощью функции DATEADD().
- В-третьих, преобразуйте значения DATETIME в DATE с помощью функции CONVERT().
3) Использование функции GENERATE_SERIES() для расчета сложных процентов за годы
Сначала создайте новую таблицу под названием «Сбережения», в которой будут храниться основная сумма и годовая процентная ставка:
CREATE TABLE savings( id INT IDENTITY PRIMARY KEY, principal money NOT NULL, interest_rate DEC(19,5) NOT NULL );
Во-вторых, вставьте строки в таблицу сбережений:
INSERT INTO savings(principal, interest_rate) VALUES (1000, 0.05), (5000, 0.07);
В-третьих, извлеките данные из таблицы сбережений:
SELECT * FROM savings;
Выход:
id | principal | interest_rate ---+-----------+-------------- 1 | 1000.0000 | 0.05000 2 | 5000.0000 | 0.07000 (2 rows)
Наконец, перекрестно соедините таблицу сбережений с серией чисел, сгенерированной функцией GENERATE_SERIES(), чтобы рассчитать конечное сальдо за каждый год:
SELECT id, principal, interest_rate, VALUE, principal * POWER(1 + interest_rate, VALUE) balance FROM savings CROSS JOIN GENERATE_SERIES(1, 3);
Выход:
id | principal | interest_rate | VALUE | balance ---+-----------+---------------+-------+------------ 1 | 1000.0000 | 0.05000 | 1 | 1050.000000 1 | 1000.0000 | 0.05000 | 2 | 1102.500000 1 | 1000.0000 | 0.05000 | 3 | 1157.630000 2 | 5000.0000 | 0.07000 | 1 | 5350.000000 2 | 5000.0000 | 0.07000 | 2 | 5724.500000 2 | 5000.0000 | 0.07000 | 3 | 6125.200000 (6 rows)
Краткое содержание
- Используйте функцию GENERATE_SERIES() для генерации серии чисел в определенном диапазоне.