标准SQL中的窗口函数兼容性
我正在探索从SQL Server 2012迁移数据库代码的可能性。现有代码依赖于对SQL Server 2012中引入的窗口函数WF的支持,因此我想了解更多关于WF如何跨不同SQL DBMS实现的信息 也就是说,我对标准SQL中WF的支持程度感兴趣。是否支持行数、排名、分区、滞后、超前等?所有/部分/没有这些标准吗 撇开语法不谈,在不同的on-prem RDBMS上,WF的实现方式是否存在显著差异?对于基于云的数据库,有什么需要考虑的吗 我们可以使用 创建表EMPLOYEE_TEmployee_Id varchar50,EMPLOYEE_name NVARCHAR100 插入员工\u T 值“123-44-345”,“Jim Jason” ,'454-56-768','Robert Lewis' 以下SQL Server 2012 v11.0.6615.2命令: 选择替换员工ID“-”, ,数完 ,AVGCASTREPLACEEmployee_ID,'-',以数字形式结束 ,通过选择空,行号超出订单 ,按员工ID排序的分区上的计数*按选择无边界的空行排序 来自雇员 返回 |没有名字|没有名字|没有名字|没有名字|没有名字| |:-----:|:-----:|:-----:|:-----:|:-----:| | 12344345 | 2 | 28900556 | 1 | 1 | | 45456768 | 2 | 28900556 | 2 | 1 | 在my Teradata Web沙箱中可以执行以下操作:标准SQL中的窗口函数兼容性,sql,window-functions,Sql,Window Functions,我正在探索从SQL Server 2012迁移数据库代码的可能性。现有代码依赖于对SQL Server 2012中引入的窗口函数WF的支持,因此我想了解更多关于WF如何跨不同SQL DBMS实现的信息 也就是说,我对标准SQL中WF的支持程度感兴趣。是否支持行数、排名、分区、滞后、超前等?所有/部分/没有这些标准吗 撇开语法不谈,在不同的on-prem RDBMS上,WF的实现方式是否存在显著差异?对于基于云的数据库,有什么需要考虑的吗 我们可以使用 创建表EMPLOYEE_TEmployee_
SELECT OREPLACE(Employee_ID, '-', '')
, COUNT(*) OVER()
, AVG(CAST(OREPLACE(Employee_ID, '-', '') as int)) OVER()
, ROW_NUMBER() OVER(ORDER BY (SELECT NULL))
, COUNT(*) OVER (PARTITION BY Employee_ID ORDER BY (SELECT NULL) ROWS UNBOUNDED PRECEDING)
FROM EMPLOYEE_T
返回
|没有名字|没有名字|没有名字|没有名字|没有名字|
|:-----:|:-----:|:------:|:-----:|:-----:|
| 12344345 | 2 | 28900556.5 | 1 | 1 |
| 45456768 | 2 | 28900556.5 | 2 | 1 |
考虑到相同的结果,在我看来确实存在一个
除了在默认值和数据类型处理方面的差异外,除了SQL Server之外,RDBMS的WF功能是否存在任何显著差异?在移植功能时,也许有一些实现方面值得考虑
此外,MySQL和postgreSQL是否支持这些功能?那么像Azure SQL DWH或Snowflake这样的现代RDBMS呢?窗口函数是相当标准的 SQL Server的一个区别是范围窗口框架规范。这只支持非常有限的功能 另一个潜在差异是SELECT NULL的顺序。我不知道是否所有的数据库都支持子查询。大多数人只能处理一个常量。SQL Server不允许使用常量进行排序,即使在窗口函数中也是如此 Teradata可能对窗口框架规范相当挑剔——在大多数其他数据库不需要的情况下需要它。我觉得这相当笨拙,但其他人可能会欣赏这种直截了当的冗长
另一个主要区别是支持哪些函数。不过,如果支持SQL Server 2005和2008,您提到的那些几乎总是受支持的,它们是支持排名函数的例外,但不支持滞后或超前。窗口函数是相当标准的 SQL Server的一个区别是范围窗口框架规范。这只支持非常有限的功能 另一个潜在差异是SELECT NULL的顺序。我不知道是否所有的数据库都支持子查询。大多数人只能处理一个常量。SQL Server不允许使用常量进行排序,即使在窗口函数中也是如此 Teradata可能对窗口框架规范相当挑剔——在大多数其他数据库不需要的情况下需要它。我觉得这相当笨拙,但其他人可能会欣赏这种直截了当的冗长
另一个主要区别是支持哪些函数。不过,如果支持SQL Server 2005和2008,您提到的那些几乎总是受支持的,因为它们是支持排名函数的例外,而不是滞后或超前。实际上,SQL Server很晚才实现窗口函数,只有MySQL更晚了。。。几乎所有其他人都支持它们已经有相当一段时间了。请注意,没有适当的排序依据的行编号实际上没有意义。SQL标准允许btw上的行数。至少在Teradata ORDER BY SELECT NULL中是无用的,返回的结果与ORDER BY NULL相同,但这不是一个可重复的结果。有一个可能的问题,在您的计数示例中,Teradata需要前面无边界的行,由于历史原因,它不返回组计数,TD在20年前实现了类似的函数实际上SQL Server很晚才实现窗口函数,只有MySQL更晚。。。几乎所有其他人都支持它们已经有相当一段时间了。请注意,没有适当的排序依据的行编号实际上没有意义。SQL标准允许btw上的行数。至少在Teradata ORDER BY SELECT NULL中是无用的,返回的结果与ORDER BY NULL相同,但这不是一个可重复的结果。有一个可能的问题,在您的计数示例中,Teradata需要前面无边界的行,而不返回由于他的原因而导致的组计数
Tror的原因,TD实现了类似的功能20年AgOWHY在SQL Server?例如,它不支持间隔。为什么在SQLServer?@ DNONETs中考虑范围有限的功能?例如,它不支持间隔。