2013-11-12 1 views
0

Вот мой текущий запрос:REPLICATE Oracle, BETWEEN синтаксиса п взвешивания с SQL Server

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 

Есть ли способ можно повторить функциональность RANGE BETWEEN в SQL Server? Диапазон между текущим месяцем и 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

+0

http://technet.microsoft.com/en-us/library/ms189461. aspx К сожалению, MS SQL Server не полностью реализует RANGE, например, Oracle ... Кажется, что нет простого обходного пути. <спецификация без знака> PRECEDING Указано <спецификация без знака> для указания количества строк или значений, предшествующих текущей строке. Эта спецификация не разрешена для RANGE. – user2653921

+0

Справа вы, извинения; Наверное, мне нужно читать ближе! Выполняя еще несколько исследований, вопреки шумихе, похоже, что Microsoft по-прежнему продолжает движение по полю, без поддержки интервальных фреймов (что вы пытаетесь сделать) и нескольких других областей, связанных с функциями окна, также отсутствует. https://www.simple-talk.com/sql/learn-sql-server/window-functions-in-sql-server-part-2-the-frame/ –