Sql 计算前多个期间的平均值

Sql 计算前多个期间的平均值,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我想计算前4个季度下一个季度的平均值,按索赔类型分组。我找到了一个答案,但它似乎与我当前使用的SQL Server 2008不兼容。我似乎找不到与SQLServer2008相同的功能或解决方案 在我的版本中,似乎不能使用over函数按顺序或使用行之间的行 有人能帮我获得SQL Server 2008的相同功能吗 我想得到[Total Paid]列前4个季度的平均值 添加列4QuarterAverage与[Total Paid]之前4个季度的平均值。您可以将其替换为相关子查询或应用: 这很混乱,但

我想计算前4个季度下一个季度的平均值,按索赔类型分组。我找到了一个答案,但它似乎与我当前使用的SQL Server 2008不兼容。我似乎找不到与SQLServer2008相同的功能或解决方案

在我的版本中,似乎不能使用over函数按顺序或使用行之间的行

有人能帮我获得SQL Server 2008的相同功能吗

我想得到[Total Paid]列前4个季度的平均值


添加列4QuarterAverage与[Total Paid]之前4个季度的平均值。

您可以将其替换为相关子查询或应用:


这很混乱,但这里有另一个解决方案:

cte[PolicyNo]、[Quarter]、[Claim Grouping]、[Year]、[Total Claim]、[RowNum]为 选择 【保单编号】、【季度】、【索赔分组】、【年度】、【索赔总额】, 第二排 按[Claim Grouping]划分按[Year]、[Quarter]排序-分配行号 AS[RowNum] 来自BaseTabel 选择不同的 src.[PolicyNo],src.[Quarter],src.[Claim Grouping],src.[Year],src.[Total Claim], AVGsrc.[总索赔额] 按[Claim Grouping]进行分区,src.[rownum] 同[4四分之一平均值] 从…起 选择 cte.[rownum], cte.[保单编号], cte.[年度], cte.[季度], cte.[索赔分组], cte.[索赔总额], cte2.【总索赔】作为【总索赔】 来自cte 将cte作为cte上的cte2左连接。[声明分组]=cte2。[声明分组] 以及cte.[RowNum]-4和cte.[RowNum]-1之间的cte2.[RowNum]-获取前面的4行 src 你的帖子说你想要前四个季度的平均值,但是你的初始查询给出了前三个季度的平均值,前三个季度和当前一行的平均值

此查询将为您提供前四个季度(不包括当前季度)的平均值


如果按[年]、[季度]排序不是确定性排序,我假设它是,在每次运行时,您仍然可以在数据帧工作窗口内获得非确定性随机平均值。。。理想情况下,您希望在ORDER BY中添加一个额外的列,该列具有主键或唯一键,以使值始终在每次运行时都具有确定性。谢谢,我将在ORDER BY Clauseb中添加[PolicyNo],但这不是我遇到的主要问题-由于我使用的版本,在运行代码时会出现错误。错误显示:Msg 102,级别15,状态1,第15行“行”附近的语法不正确。SQL Server 2008不支持语法之间的行。你需要找到一个解决办法。让我看看我能不能找到什么。谢谢,我也认为这是个问题,我一直在寻找解决办法,但还没有找到任何东西。我也尝试过使用LAG,但它与SQL Server 2008不兼容。谢谢!在尝试实现此解决方案时,我遇到了一个语法错误-我似乎不明白为什么,因为一切似乎都井然有序:Msg 102,15级,状态1,第11行附近的语法不正确。终于到了line@HelenaViljoen . . . 这是倒数第二次。桌子别名不见了。谢谢,我很感激!谢谢@ravioli,这似乎成功了!它现在工作得很好!
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
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;