Sah*_*sci 6 sql-server sql-server-2019
MS SQL Server 是否有像Postgresql那样的系列生成函数(又名generate_series)。如果没有,有没有基本的方法来实现该功能?优先考虑时间戳版本
我发现这个问题是一个老问题。也许新版本有更好的解决方案。
Mar*_*ith 15
从 SQL Server 2022 开始,您可以执行以下操作
\nSELECT Value\nFROM GENERATE_SERIES( /* START= */ 1, /* STOP= */ 100, /* STEP= */ 1)\n
Run Code Online (Sandbox Code Playgroud)\n在 SQL Bits 2022 上,据说它还将支持日期和数字,但这似乎并没有进入该函数的初始版本。但它仍然可以与 结合使用DATEADD
来生成日期和日期时间。
看起来效果很好。
\n\xe2\x9c\x85数字生成的执行时间\n下面在我的测试虚拟机中在 700 毫秒内生成 10,000,000 个数字(分配给变量消除了将结果发送到客户端的任何开销)
\nDECLARE @Value INT \n\nSELECT @Value =[value]\nFROM GENERATE_SERIES(1, 10000000)\n
Run Code Online (Sandbox Code Playgroud)\n\xe2\x9c\x85基数估计
\n计算运算符将返回多少个数字很简单,SQL Server 利用了这一点,如下所示。
\n\n\xe2\x9c\x85 没有不必要的万圣节保护
\n在 CTP 2.0 及更早版本中,将此函数的结果插入表时的执行计划可能具有不必要的假脱机。现在这个问题似乎已经得到解决。
\nCREATE TABLE dbo.Numbers(Number INT PRIMARY KEY);\n\nINSERT INTO dbo.Numbers\nSELECT [value]\nFROM GENERATE_SERIES(1, 10);\n
Run Code Online (Sandbox Code Playgroud)\n\n\xe2\x9c\x85 没有不必要的排序或区分
\n在CTP 2.0 及更早版本中,添加 anORDER BY [value]
可以向计划添加排序,即使函数无论如何都按该顺序返回它们。现在这个问题似乎又得到了解决。
SELECT DISTINCT [value]\nFROM GENERATE_SERIES(1, 10)\nORDER BY [value] \n
Run Code Online (Sandbox Code Playgroud)\n\n
在 T-SQL 中创建系列的一种相当常见的方法是使用 CTE 作为源,如下所示:
;WITH t AS
(
SELECT n = v2.n * 10 + v1.n
FROM (VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9)) v1(n)
CROSS JOIN (VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9)) v2(n)
)
SELECT t.n
FROM t
ORDER BY T.n;
Run Code Online (Sandbox Code Playgroud)
上面的查询将返回从 0 到 99 的有序值列表。
对于日期,您可以这样实现:
;WITH t AS
(
SELECT n = v2.n * 10 + v1.n
FROM (VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9)) v1(n)
CROSS JOIN (VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9)) v2(n)
)
SELECT DATEADD(DAY, t.n, '2019-01-01')
FROM t
ORDER BY T.n;
Run Code Online (Sandbox Code Playgroud)
其中提供了从 2019 年 1 月 1 日开始,持续 100 天,到 2019 年 4 月 10 日结束的日期列表。
还有许多其他方法可以生成这样的集合,包括生成“数字”表。
归档时间: |
|
查看次数: |
12313 次 |
最近记录: |