Функция SQL Server GENERATE_SERIES()

В этом руководстве вы узнаете, как использовать функцию 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() для генерации серии чисел в определенном диапазоне.
Мирослав С.

Автор статей, ИБ-специалист