SQLServer2022新特性 GENERATE_SERIES函数,在给定间隔内生成一系列数字。 序列值之间的间隔和步骤由用户定义。
参考官方地址
https://learn.microsoft.com/en-us/sql/t-sql/functions/generate-series-transact-sql?view=sql-server-ver16
在给定间隔内生成一系列数字。 序列值之间的间隔和步骤由用户定义。
GENERATE_SERIES
要求兼容性级别至少为 160。 兼容性级别低于 160 时,数据库引擎将找不到 GENERATE_SERIES
函数。
若要更改数据库的兼容性级别,请参阅查看或更改数据库的兼容性级别。
Transact-SQL 语法约定
GENERATE_SERIES ( start , stop [ , step ] )
start
间隔中的第一个值。 start 会指定为变量、文本或者类型为 tinyint、smallint、int、bigint、decimal 或 numeric 的标量表达式。
stop
间隔中的最后一个值。 stop 会指定为变量、文本或者类型为 tinyint、smallint、int、bigint、decimal 或 numeric 的标量表达式。 最后一个生成的步骤值超过 stop 值后,序列将停止。
stop 的数据类型必须与 start 的数据类型匹配。
step
表明在系列中的步骤之间要增加或减少的值的数量。 step 是 tinyint、smallint、int、bigint、decimal 或 numeric 类型的表达式。 step 可以是负数或正值,但不能为零 (0
)。
该参数可选。 如果 start 小于 stop,则 step 的默认值为 1,否则,如果 start 大于 stop,则默认值为 -1。
如果 start 小于 stop 并且为 step 指定了负值,或者如果 start 大于 stop 并且为 step指定了正值,会返回一个空结果集。
返回一个包含一系列值的单列表,其中每个值与前一个值相差 step。 列的名称为 value
。 输出与 start 和 stop 的类型相同。
GENERATE_SERIES
不需要任何权限。 但是,用户需要数据库 EXECUTE 权限,以及查询用作输入的任何数据的权限。
以下示例展示了调用 GENERATE_SERIES
的语法。
SELECT value FROM GENERATE_SERIES(1, 10);
value
-----------
1
2
3
4
5
6
7
8
9
10
SELECT value FROM GENERATE_SERIES(1, 50, 5);
value
-----------
1
6
11
16
21
26
31
36
41
46
DECLARE @start decimal(2, 1) = 0.0;
DECLARE @stop decimal(2, 1) = 1.0;
DECLARE @step decimal(2, 1) = 0.2;
SELECT value FROM GENERATE_SERIES(@start, @stop, @step);
value
---------------------------------------
0.0
0.2
0.4
0.6
0.8
1.0
(6 行受影响)
Using the GENERATE_SERIES() function to a series of dates
生成从 '2024-06-26'
开始的 7 个连续的日期值
The following example uses the GENERATE_SERIES()
function to generate a series of 7 date values starting from 2024-06-26
SELECT CONVERT(DATE, DATEADD (DAY, VALUE, '2024-06-26')) AS DATE FROM GENERATE_SERIES (0, 6);
DATE
----------------
2024-06-26
2024-06-27
2024-06-28
2024-06-29
2024-06-30
2024-07-01
2024-07-02
(7 rows affected)
它是如何工作的。
How it works.
First, generate a series of integers from 0 to 6 using the GENERATE_SERIES() function. These numbers represent the number of days that we add to the starting date (‘2024-06-26’).
Second, for each number generated by the GENERATE_SERIES() function, add the corresponding number of days to the starting date (‘2024-06-26’) using the DATEADD() function.
Third, convert the DATETIME values to DATE using the CONVERT() function.
使用GENERATE_SERIES()函数计算历年的复利
First, create a new table called t_savings that stores the principal and annual interest rate
首先,创建一个名为t_savings
的新表,用于存储本金和年利率
CREATE TABLE t_savings
(
id INT IDENTITY PRIMARY KEY,
principal DECIMAL(18,2) NOT NULL,
interest_rate DEC(19,5) NOT NULL
);
Second, insert rows into the t_savings table
其次,向储蓄表中插入行
INSERT INTO t_savings (principal, interest_rate)
VALUES (1008, 0.05),(5000, 0.18),
(6700, 0.53),(5056, 0.87),(6212, 0.54);
Third, retrieve data from the t_savings table
第三,从储蓄表中检索数据
SELECT * FROM t_savings
id principal interest_rate
----------- --------------------------------------- ---------------------------------------
1 1008.00 0.05000
2 5000.00 0.18000
3 6700.00 0.53000
4 5056.00 0.87000
5 6212.00 0.54000
(5 行受影响)
Finally, cross join the savings table with the series of numbers generated by the GENERATE_SERIES() function to calculate the ending balance each year
最后,将储蓄表与GENERATE_SERIES()函数生成的一系列数字交叉连接,以计算每年的期末余额
SELECT
id,
principal,
interest_rate,
VALUE,
principal * POWER(1 + interest_rate, VALUE) balance
FROM t_savings
CROSS JOIN GENERATE_SERIES(1, 3);
id principal interest_rate VALUE balance
----------- --------------------------------------- --------------------------------------- ----------- ---------------------------------------
1 1008.00 0.05000 1 1058.400000
1 1008.00 0.05000 2 1111.320000
1 1008.00 0.05000 3 1166.891040
2 5000.00 0.18000 1 5900.000000
2 5000.00 0.18000 2 6962.000000
2 5000.00 0.18000 3 8215.150000
3 6700.00 0.53000 1 10251.000000
3 6700.00 0.53000 2 15684.030000
3 6700.00 0.53000 3 23996.586000
4 5056.00 0.87000 1 9454.720000
4 5056.00 0.87000 2 17680.326400
4 5056.00 0.87000 3 33062.195200
5 6212.00 0.54000 1 9566.480000
5 6212.00 0.54000 2 14732.379200
5 6212.00 0.54000 3 22687.839120
(15 行受影响)
参考文档地址如下
https://www.sqlservertutorial.net/sql-server-system-functions/sql-server-generate_series/
SQL Server GENERATE_SERIES() Function (sqlservertutorial.net)
SELECT value AS key_value,NEWID() AS sys_guid,RAND(CHECKSUM(NEWID())) AS RandomFloat, ABS(CHECKSUM(NEWID())) % 101 AS RandomNumber FROM generate_series(1,10) ;
key_value sys_guid RandomFloat RandomNumber
----------- ------------------------------------ ---------------------- ------------
1 52801F8D-6239-4EB3-B088-ADAA21B6421B 0.193339705149037 37
2 AA1B40CD-69E6-4D31-9DC3-08040F0D7BAD 0.609335014906728 89
3 C87AE677-64A2-4DD2-8F15-BD5B88656458 0.405448226599017 77
4 31123D2D-1139-4DF5-95E7-907325D218EC 0.878666761066185 54
5 6124C97D-0B60-4DBD-A661-9B98A53E80F4 0.765808999456877 11
6 12AF0A56-33D4-4823-8DE6-4BD32385778F 0.754044405713803 96
7 B129CA05-C857-41CE-BA87-6337DF53AFB2 0.04266710136897 39
8 C01D6FD8-A31D-40B3-A3A9-60AB42D3D910 0.262966783899889 11
9 F61693CB-FCDD-41CD-A443-BD2332953219 0.179683512783314 16
10 6950C933-90B8-4B1B-84E6-111323C46E0C 0.036969944911055 46
(10 行受影响)
注意:
% 101
是为了确保结果在 0 到 100 之间(包括 0 和 100)。RAND()
函数在 SQL Server 中的工作方式,如果你在一个查询中多次调用它(没有使用 NEWID()
或其他方法作为种子),它可能会为查询中的每一行返回相同的值