SQLServer2022新特性 GENERATE_SERIES函数

SQLServer2022新特性 GENERATE_SERIES函数,在给定间隔内生成一系列数字。 序列值之间的间隔和步骤由用户定义。

参考官方地址
https://learn.microsoft.com/en-us/sql/t-sql/functions/generate-series-transact-sql?view=sql-server-ver16

1、本文内容

  • 语法
  • 参数
  • 返回类型
  • 权限
  • 示例
  • 相关内容

适用于:

  • SQL Server 2022 (16.x)
  • Azure SQL 数据库
  • Azure SQL 托管实例
  • Microsoft Fabric 中的 SQL 分析终结点
  • Microsoft Fabric 中的仓库

在给定间隔内生成一系列数字。 序列值之间的间隔和步骤由用户定义。

兼容性级别 160

GENERATE_SERIES 要求兼容性级别至少为 160。 兼容性级别低于 160 时,数据库引擎将找不到 GENERATE_SERIES 函数。

若要更改数据库的兼容性级别,请参阅查看或更改数据库的兼容性级别。

Transact-SQL 语法约定

2、语法

GENERATE_SERIES ( start , stop [ , step ] )

3、参数

  • 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指定了正值,会返回一个空结果集。

4、返回类型

返回一个包含一系列值的单列表,其中每个值与前一个值相差 step。 列的名称为 value。 输出与 start 和 stop 的类型相同。

5、权限

GENERATE_SERIES 不需要任何权限。 但是,用户需要数据库 EXECUTE 权限,以及查询用作输入的任何数据的权限。

6、示例

以下示例展示了调用 GENERATE_SERIES 的语法。

6.1、以 1 为增量生成 1 到 10 之间的一系列整数值(默认)

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

6.2、以 5 为增量生成 1 到 50 之间的一系列整数值

SELECT value FROM GENERATE_SERIES(1, 50, 5);value
-----------
1
6
11
16
21
26
31
36
41
46

6.3、以 0.2 为增量生成 0.0 到 1.0 之间的一系列十进制值

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 行受影响)

6.4、生成一个日期序列

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-262024-06-272024-06-282024-06-292024-06-302024-07-012024-07-02(7 rows affected)

它是如何工作的。

  • 首先,使用GENERATE_SERIES()函数生成一系列从0到6的整数。这些数字表示我们在开始日期(‘2024-06-26’)上添加的天数。
  • 其次,对GENERATE_SERIES()函数生成的每个数字,使用DATEADD()函数将相应的天数添加到开始日期(‘2024-06-26’)上。
  • 第三,使用convert()函数将DATETIME值转换为DATE。

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.

6.5、Using the GENERATE_SERIES() function to calculate compound interest over years

使用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_savingsid          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()函数生成的一系列数字交叉连接,以计算每年的期末余额

SELECTid,principal,interest_rate,VALUE,principal * POWER(1 + interest_rate, VALUE) balance
FROM t_savingsCROSS 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)

6.5、批量生成一些测试数据

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 行受影响)

注意:

  • RAND(CHECKSUM(NEWID())) 生成 0 到 1 之间的随机浮点数
  • 使用 NEWID() 和 CHECKSUM() 生成 0 到某个整数(例如 100)之间的随机整数
  • % 101 是为了确保结果在 0 到 100 之间(包括 0 和 100)。
  • 由于 RAND() 函数在 SQL Server 中的工作方式,如果你在一个查询中多次调用它(没有使用 NEWID() 或其他方法作为种子),它可能会为查询中的每一行返回相同的值
  • 随机数的生成在数据库系统中通常不是最佳实践,除非有特定的需求(例如测试或模拟)。在大多数情况下,最好在应用程序级别生成随机数,并将它们作为参数传递给数据库查询

7、相关内容

  • SEQUENCES (Transact-SQL) - SQL Server | Microsoft Learn
  • Relational operators (Transact-SQL) - SQL Server | Microsoft Learn

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/36079.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

国产操作系统上多种压缩和解压命令详解 _ 统信 _ 麒麟 _ 中科方德

原文链接:国产操作系统上多种压缩和解压命令详解 | 统信 | 麒麟 | 中科方德 Hello,大家好啊!今天给大家带来一篇在国产操作系统上多种压缩和解压命令详解的文章。压缩和解压缩是我们在日常工作中经常需要进行的操作,尤其是在处理大…

【AIGC】用 AI 绘画 诠释印象派!关键词、安装包分享!

前言 印象派艺术运动是19世纪60年代法国的一场艺术革命,它不仅革新了绘画技法,更重新诠释了光与色彩、自然与美。印象派艺术家,如莫奈、雷诺阿和德加,通过捕捉自然光线的瞬息变化,用色彩和笔触表达对现实世界的独特感…

Theta方法:一种时间序列分解与预测的简化方法

Theta方法整合了两个基本概念:分解时间序列和利用基本预测技术来估计未来的价值。 每个数据科学爱好者都知道,时间序列是按一定时间间隔收集或记录的一系列数据点。例如,每日温度或经济指标的月值。把时间序列想象成不同成分的组合,趋势(数据…

【linux/shell】shell中使用for循环读取数据

目录 一.for循环从列表中读取数据的几种形式 二.for循环从配置文件读取数据 三.for循环用通配符读取目录 四.for循环带有数字变量 一.for循环从列表中读取数据的几种形式 #!/bin/bash listl"aa bb cc" list2aa bb ccfor i in $list3 doecho $i done 使用这种形…

取证工作:怎样解锁 LUKS2 加密磁盘?

对于 LUKS2 密码进行恢复,Elcomsoft Distributed Password Recovery (简称 EDPR) 软件可以构建高性能集群,以更快地破解密码。EDPR 软件提供零开销的可扩展性,并支持 GPU 加速,以加快恢复速度。EDPR 可帮助…

Redis-实战篇-编码解决商铺查询的缓存穿透问题(缓存空对象)

文章目录 1、缓存穿透2、常见的解决方案有两种:2.1、缓存空对象2.2、布隆过滤器 3、编码解决商铺查询的缓存穿透问题3.1、queryById3.2、RedisConstants.java 1、缓存穿透 缓存击穿是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效…

Spring Boot中使用Feign进行HTTP请求

Spring Boot中使用Feign进行HTTP请求 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们来探讨一下如何在Spring Boot中使用Feign进行HTTP请求。 一、Fei…

【b站-湖科大教书匠】3 数据链路层-计算机网络微课堂

课程地址:【计算机网络微课堂(有字幕无背景音乐版)】 https://www.bilibili.com/video/BV1c4411d7jb/?share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 3 数据链路层 3.1 数据链路层概述 3.1.1 数据链路层在网络体系结…

2024华为数通HCIP-datacom最新题库(变题更新⑤)

请注意,华为HCIP-Datacom考试831已变题 请注意,华为HCIP-Datacom考试831已变题 请注意,华为HCIP-Datacom考试831已变题 近期打算考HCIP的朋友注意了,如果你准备去考试,还是用的之前的题库,切记暂缓。 1、…

Python的with语句与上下文管理器:深入解析与实战应用

Python的with语句与上下文管理器:深入解析与实战应用 在Python编程中,with语句是一个强大的特性,它提供了一种简洁的方式来管理资源,如文件、网络连接等。通过使用with语句,我们可以确保在代码块执行完毕后&#xff0…

Python中的enumerate函数:索引与值的完美搭档

Python中的enumerate函数:索引与值的完美搭档 在Python编程中,遍历列表、元组或其他可迭代对象时,我们经常会需要同时访问每个元素的索引和值。这时,enumerate()函数就显得尤为重要,它为我们提供了一个简洁而高效的方…

【项目管理体系】代码评审规范

1完整性检查 2一致性检查 3正确性检查 4可预测性检查 5健壮性检查 6结构性检查 7可追溯性检查 8可理解性检查 9可验证性检查 软件开发全套资料获取:(本文末个人名片直接获取) 软件产品,特别是行业解决方案软件产品不同于一般的商品…

JavaScript中常用数据类型做布尔值(Boolean)转换

一、前言 二、示例 1、String转Boolean 2、Number转Boolean 3、NaN、Null、undefined 转Boolean 4、Object转Boolean 5、Array转Boolean 6、Symbol转Boolean 三、总结 四、思考 一、前言 JavaScript中,经常需要对一些值进行boolean判断,根据判…

DDoS攻击的最新防御策略:从检测到缓解的全方位方案

在数字化浪潮的推动下,互联网已成为现代社会的血脉。然而,随着网络空间的不断膨胀,分布式拒绝服务(DDoS)攻击如同潜伏在暗处的猛兽,随时准备发动致命一击,威胁着网络的稳定与安全。面对这一严峻…

前端-echarts tooltip展示多项自定义数据

效果如图,鼠标滑动到某一个柱子的时候,出现这一项数据的多个自定义数据,外加自己的模板样式渲染。 希望能展示每一列中的多个自定义数据 代码部分 主要是在data中,value就是实际展示的主数据,其他字段名为自定义的数…

【面试系列】Swift 高频面试题及详细解答

欢迎来到我的博客,很高兴能够在这里和您见面!欢迎订阅相关专栏: ⭐️ 全网最全IT互联网公司面试宝典:收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来:详细讲解AIGC的概念、核心技术、…

ArUco 相关(opencv)

主要的问题还是随着opencv的版本升级,对aruco模块的函数命名变化挺大的,因此需要正确调用opencv对应版本下的aruco相关函数,不然程序无法运行,会报各种异常 在线ArUco工具 https://chev.me/arucogen/ 保存下来的是svg格式 环境 …

Linux常见操作问题

1、登录刚创建的用户,无法操作。 注:etc/passwd文件是Linux操作系统中存储用户账户信息的文本文件,包含了系统中所有用户的基本信息,比如用户名、用户ID、用户组ID、用户家目录路径。 注:etc: 这个目录存放所有的系统…

Android关机闹钟的实现原理以及基于高通的实现

最近新到了一家公司, 做手机的rom, 刚来被分配做改造DeckClock这个部分以便熟悉整个代码环境.里面包含闹钟, 世界时钟, 定时器, 秒表四块. 我们是基于OnePlus的rom的基础上进行修改. 当我看到产品说关机闹钟相关的东西的时候, 因为之前懂一些关于RTC的东西, 就说这个是要基于RT…

Java工具包——Lombok

目录 1. maven仓库手动导入依赖注解 1.1 maven仓库引入依赖 1.2 在类上使用Data注解 1.3 在属性上使用Getter与Setter注解 2. EditStarters插件注解 2.1 安装EditStarters插件 2.2 在pom.xml中进行操作 2.3 在java对象类中使用注解 3. lombok工具使用结果查看 3.1…