Это грязно, но вот еще одно решение:
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