Рассчитать среднее значение за предыдущие несколько периодов - PullRequest
0 голосов
/ 03 октября 2019

Я хочу рассчитать среднее значение за предыдущие 4 квартала для следующего квартала, сгруппированного по типу заявки. Я нашел ответ, но он не совместим с SQL Server 2008, который я сейчас использую. Кажется, я не могу найти те же функции или решения для SQL Server 2008.

Кажется, вы не можете заказать или использовать rows between с over function в моей версии.

Может кто-нибудь помочь мне получить ту же функциональность для SQL Server 2008?

Я хочу получить среднее значение за 4 предыдущих квартала для столбца [Total Paid]

SELECT 
    [PolicyNo] AS [PolicyNo],
    [Quarter] AS [Quarter],
    [Claim Grouping] AS [Claim Grouping],
    [Year] AS [Year],
    [Total Claim] AS [Total Claim],
    AVG([Total Claim]) OVER (PARTITION BY [Claim Grouping] ORDER BY [Year], [Quarter]
                             ROWS BETWEEN 3 PRECEDING AND CURRENT ROW) AS [4QuarterAverage]
FROM 
    BaseTable

Добавлен столбец 4QuarterAverage со средним значением 4 preceding quarters для [Total Paid]

Ответы [ 2 ]

0 голосов
/ 03 октября 2019

Это грязно, но вот еще одно решение:

WITH cte([PolicyNo], [Quarter], [Claim Grouping], [Year], [Total Claim], [RowNum]) AS (
  SELECT 
    [PolicyNo], [Quarter], [Claim Grouping], [Year], [Total Claim],
    ROW_NUMBER() OVER(
      PARTITION BY [Claim Grouping] ORDER BY [Year], [Quarter] -- Assign "row numbers"
    ) AS [RowNum]
  FROM BaseTabel
)
SELECT DISTINCT 
  src.[PolicyNo], src.[Quarter], src.[Claim Grouping], src.[Year], src.[Total Claim],
  AVG(src.[Total_Claim_prev]) OVER(
    PARTITION BY [Claim Grouping], src.[rownum]
  ) AS [4QuarterAverage]
FROM (
  SELECT 
    cte.[rownum],
    cte.[PolicyNo], 
    cte.[Year], 
    cte.[Quarter], 
    cte.[Claim Grouping],
    cte.[Total Claim], 
    cte2.[total claim] AS [Total_Claim_prev]
  FROM cte
  LEFT JOIN cte AS cte2 ON cte.[Claim Grouping] = cte2.[Claim Grouping]
    AND cte2.[RowNum] BETWEEN cte.[RowNum] - 4 AND cte.[RowNum] - 1 -- Get 4 previous rows
) src

В вашем сообщении говорится, что вы хотите получить среднее значение за четыре предыдущих квартала, но в вашем первоначальном запросе указано среднее значение за три предыдущих квартала (THREE PRECEDING)и текущий (CURRENT ROW).

Этот запрос даст вам среднее значение за четыре предыдущих квартала, исключая текущий.

SQL Fiddle

0 голосов
/ 03 октября 2019

Вы можете заменить это коррелированным подзапросом или apply:

SELECT bt.*, bt2.[4QuarterAverage]
FROM BaseTabel bt OUTER APPLY
     (SELECT AVG(bt2.[Total Claim]) as [4QuarterAverage]
      FROM (SELECT TOP (4) bt2.*
            FROM BaseTabel bt2
            WHERE (bt2.YEAR < bt.YEAR OR
                   (bt2.YEAR = bt.YEAR AND bt2.Quarter <= bt.Quarter)
                  )
            ORDER BY bt2.YEAR DESC, bt2.Quarter DESC
           ) bt2
      ) bt2;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...