Оконные функции SQL Server: можете ли вы создать строку типа ROWWEEN? - PullRequest
1 голос
/ 29 июня 2011

Это моя версия SQL Server:

Microsoft SQL Server 2008 (SP2) - 10.0.4064.0 (X64) 25 февраля 2011 г. 13:56:11 Copyright (c) 1988-2008 Microsoft Corporation Enterprise Edition (64-разрядная версия) в Windows NT 6.0 (сборка 6002: служба Пакет 2)

Я хочу сделать что-то вроде этого (которое работает в Sybase):

SELECT AVG(ct) OVER (PARTITION BY val1 
                         ORDER BY val2 ASC ROWS BETWEEN 6 PRECEDING AND CURRENT ROW)
FROM table

Есть ли способ реализовать что-то вроде этого БЕЗ какого-нибудь неприятного самостоятельного объединения или подзапроса, использующего номер строки и т. Д.? Я полагаю, что если я должен это сделать, я бы хотел использовать самый лучший и компактный код.

EDIT:
Согласно комментариям, вот что я хотел бы сделать.

У меня есть time_id и значение. Я хочу взять скользящее среднее (1 неделя) от значения. Довольно просто.

Ответы [ 2 ]

3 голосов
/ 29 июня 2011

Вот что я бы, вероятно, сделал бы следующим образом:

WITH ranked AS (
  SELECT
    val1,
    val2,
    ct,
    rank = ROW_NUMBER() OVER (PARTITION BY val1 ORDER BY val2)
  FROM table
)
SELECT
  r.val1,
  r.val2,
  avg_ct = AVG(r2.ct)
FROM ranked r
  INNER JOIN ranked r2 ON r2.val1 = r.val1
                      AND r2.rank BETWEEN r.rank - 6 AND r.rank
GROUP BY r.val1, r.val2

Определенно, не такой элегантный и лаконичный, как версия Sybase, но, как по мне, тоже не так уж и плохо.

1 голос
/ 30 марта 2012

Попробуйте это:

SELECT T1.*, T2.myAvgValue from myTable T1
OUTER APPLY (SELECT Avg(T3.myValue) myAvgValue FROM myTable T3 WHERE T3.Date BETWEEN T1.Date-7 and T1.Date) T2

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...