使用 SQL Server 复制 Oracle 的 RANGE BETWEEN 窗口子句语法

Posted

技术标签:

【中文标题】使用 SQL Server 复制 Oracle 的 RANGE BETWEEN 窗口子句语法【英文标题】:Replicate Oracle's RANGE BETWEEN windowing clause syntax with SQL Server 【发布时间】:2013-11-12 16:41:12 【问题描述】:

这是我当前的查询:

SELECT 
item_id, 
date,
(avg *  stddev(value) over(partition by item_id order by to_date(date,'yyyymm')
RANGE BETWEEN INTERVAL '11' MONTH PRECEDING AND CURRENT ROW)
+
price *  stddev(value2) OVER(PARTITION BY item_id ORDER BY to_date(date,'yyyymm')
RANGE BETWEEN INTERVAL '11' MONTH PRECEDING AND CURRENT ROW)
) as a
from table1

有没有办法在 SQL Server 中复制RANGE BETWEEN 的功能?介于当前月份和前 11 个月之间。

【问题讨论】:

【参考方案1】:

从 2012 版本开始,SQL Server 添加了对窗口函数的支持,就像您在 Oracle 中所做的一样。唯一的区别是日期处理,因为 Oracle 对日期间隔文字值有独特的语法(例如“INTERVAL '11' MONTH”)。

有关 SQL Server 2012 中窗口函数的信息,请参阅http://technet.microsoft.com/en-us/library/ms189461.aspx

有关日期范围处理的信息,请参阅http://technet.microsoft.com/en-us/library/ms186724.aspx

【讨论】:

technet.microsoft.com/en-us/library/ms189461.aspx 不幸的是,MS SQL Server 并没有像 Oracle 那样完全实现 RANGE... 似乎没有简单的解决方法。 PRECEDING 用指定以指示当前行之前的行数或值。 RANGE 不允许使用此规范。 对,对不起;我想我需要仔细阅读!做一些更多的研究,与炒作相反,看起来微软确实仍然落后于这个领域,不支持基于间隔的帧(你正在尝试做的事情),并且与窗口函数相关的其他几个领域也缺失了。 simple-talk.com/sql/learn-sql-server/…

以上是关于使用 SQL Server 复制 Oracle 的 RANGE BETWEEN 窗口子句语法的主要内容,如果未能解决你的问题,请参考以下文章

创建 SSIS 包 - 将数据从 Oracle 复制到 SQL Server

Oracle和sql server中复制表结构和表数据的sql语句

AS 兼容性:“.. from T as a..”适用于 MySQL 和 SQL Server,而不适用于 Oracle? [复制]

在SQL Sever复制数据库时出现启动、执行SQL Server代理作业错误的解决方法

怎么将数据库从Oracle迁移到SQL Server,或从Oracle迁移到MySQL

sql文件怎么导入到Oracle数据库