Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
标准SQL中的窗口函数兼容性_Sql_Window Functions - Fatal编程技术网

标准SQL中的窗口函数兼容性

标准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_

我正在探索从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沙箱中可以执行以下操作:

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中考虑范围有限的功能?例如,它不支持间隔。