SQL Server 2008 с использованием SUM () OVER (ORDER BY ...) - PullRequest
2 голосов
/ 04 октября 2011

Я пытаюсь использовать CTE и CROSS JOIN для набора результатов. Я хочу подвести итог 4 строк, ведущих к текущей строке. В приведенном мной примере в сети не используется CTE, только недавно созданная таблица (http://sqlandme.com/2011/08/17/sql-server-denali-over-rows-range/). Синтаксис должен работать, но я получаю сообщение об ошибке "Неверный синтаксис рядом с 'ROWS'".

Пример вывода может быть следующим: СУММА (у) НАД (ЗАКАЗ ПО ХРАВАМ 4 ПРЕДВАРИТЕЛЬНЫХ), сумма

X Y SUM


     1          7     0     No prev rows, so sum is 0
     2          1     7     Sum   = 7 
     3          2     8           = 1 + 7
     4          5     10          = 2 + 1 + 7
     5          7     15          = 5 + 2 + 1 + 7
     6         34     15          = 7 + 5 + 2 + 1
     7         32     48          = 34 + 7 + 5 + 2

У кого-нибудь есть предложения по поводу неправильности запроса? Заранее спасибо.

with quarterResults as (
      <subquery in here>
)

--COLUMN1: String
--COLUMN2: Date
--COLUMN3: Date
--COLUMN4: Double
select a.TIC, a.DATADATE, a.EFFDATE, SUM(b.valuei) OVER (ORDER BY a.TIC, a.DATADATE, a.EFFDATE ROWS 4 PRECEDING) AS [SUM]
from quarterResults a
cross join quarterResults b
where a.datadate > b.datadate
group by a.tic, a.datadate, a.EFFDATE, a.valuei
order by a.TIC, a.datadate

Ответы [ 2 ]

2 голосов
/ 04 октября 2011

Документация, которую вы нашли для ROWS / RANGE, относится не к SQL Server 2008, а к будущей версии SQL Server.

Для выполнения вашего запроса в SQL 2008 один из подходов будет похож на:

SELECT a.TIC, a.datadate, a.effdate, x.s
FROM quarterResults a
    CROSS APPLY (   SELECT ISNULL(SUM(v), 0)
                    FROM (  SELECT TOP(4) b.valuei
                            FROM quarterResults b
                            WHERE b.datadate < a.datadate
                            ORDER BY b.datadate DESC ) x(v)
                ) x(s)
ORDER BY a.TIC, a.datadate

Обратите внимание, что это потенциально дорогой запрос. Использование выражения OVER с ROWS, вероятно, будет более эффективным, но, опять же, оно недоступно в SQL Server 2008.

0 голосов
/ 04 октября 2011

Вы пометили SQL Server 2008.

Синтаксис не готов до следующего выпуска SQL Server 2012 aka Denali

...