【问题标题】:Error while calculating 4 Day Rolling Average in SQL在 SQL 中计算 4 天滚动平均值时出错
【发布时间】:2018-10-03 17:12:23
【问题描述】:

我正在尝试在 SQL 中计算 4 天滚动平均值。我有以下格式的日期。我的桌子上有很多公司。我必须为每家公司分别计算滚动平均值。但是我下面的查询是在不区分公司的情况下执行滚动平均。

请更正我的查询。预期输出如下:

  select 
[date],[PX_VOLUME],[Company],
avg([PX_VOLUME]) OVER (ORDER BY [date],[Company] ROWS BETWEEN 3 PRECEDING AND CURRENT ROW) as monthrolling
into dbo.[Equity_Indicators_window]
from dbo.[Equity_Indicators_V1]
group by [Company],[date],[PX_VOLUME]
order by [date]  

输入数据:

date    PX_Volume   Company
2018-06-22  7455031       ABC HOLDINGS
2018-06-22  801629        LEMAITRE VASLA
2018-06-22  23951629         CLUB CORP
2018-06-23  7455041       ABC HOLDINGS
2018-06-23  801631        LEMAITRE VASLA
2018-06-23  23951643         CLUB CORP
2018-06-24  745506        ABC HOLDINGS
2018-06-24  801666        LEMAITRE VASLA
2018-06-24  23951698         CLUB CORP
2018-06-25  7455031       ABC HOLDINGS
2018-06-25  801629        LEMAITRE VASLA
2018-06-25  23951629         CLUB CORP
2018-06-26  7455031       ABC HOLDINGS
2018-06-26  801629        LEMAITRE VASLA
2018-06-26  23951629         CLUB CORP

预期输出:

date          PX_Volume          Company    monthrolling
2018-06-22  7455031       ABC HOLDINGS    7455031
2018-06-22  801629        LEMAITRE VASLA    801629
2018-06-22  23951629         CLUB CORP      23951629
2018-06-23  7455041       ABC HOLDINGS     7455036
2018-06-23  801631        LEMAITRE VASLA    801630
2018-06-23  23951643         CLUB CORP     23951636
2018-06-24  745506        ABC HOLDINGS      5218526
2018-06-24  801666        LEMAITRE VASLA    801642
2018-06-24  23951698         CLUB CORP     23951656.67
2018-06-25  7455031       ABC HOLDINGS     5777652.25
2018-06-25  801629        LEMAITRE VASLA    801638.75
2018-06-25  23951629         CLUB CORP      23951649.75
2018-06-26  7455031       ABC HOLDINGS     5777652.25
2018-06-26  801629        LEMAITRE VASLA    801638.75
2018-06-26  23951629         CLUB CORP     23951649.75

【问题讨论】:

    标签: sql sql-server moving-average


    【解决方案1】:

    您的问题是group by 中的px_volume。我想你打算:

    select [date], [Company], sum(px_volume) as px_volume,
           avg(sum(px_volume)) over (partition by company
                                     order by [date]
                                     rows between 3 preceding and current_row
                                    ) as monthrolling
    into dbo.[Equity_Indicators_window]
    from dbo.[Equity_Indicators_V1]
    group by [Company], [date]
    order by [date] ;
    

    注意partition by company

    如果您在每个日期每个公司有一行,则不需要聚合。那将是:

    select [date], Company, px_volume,
           avg(px_volume) over (partition by company
                                order by [date]
                                rows between 3 preceding and current_row
                               ) as monthrolling
    into dbo.[Equity_Indicators_window]
    from dbo.[Equity_Indicators_V1]
    order by [date]     
    

    【讨论】:

    • @ArvinthKumar 。 . .令我惊讶的是,您接受了在此之后近 20 分钟发布的等效答案。
    • 对不起,我没有检查订单。
    【解决方案2】:

    您的查询难以阅读 在这种情况下,我建议您使用 CTE AND 在您的 over 子句中使用 partition by

    with c as(
    Select 
    [date]
    ,[Company]
    ,AVG([PX_VOLUME]) AS PX_VOLUME
    from dbo.[Equity_Indicators_V1]
    group by [Company],[date]
    
    )
    SELECT [date]
          ,[PX_VOLUME]
          ,[Company]
          ,avg([PX_VOLUME]) OVER (Partition by [date],[Company] ORDER BY [date],[Company] ROWS BETWEEN 3 PRECEDING AND CURRENT ROW ) as monthrolling
    into dbo.[Equity_Indicators_window]    
    FROM C 
    

    尝试按步骤进行

    【讨论】:

    • 未按预期工作。感谢您抽出宝贵时间!
    【解决方案3】:

    试试下面的(需要在partition by子句中取公司):

    SELECT [date], 
           [PX_VOLUME], 
           [Company], 
           ROUND(AVG(CONVERT(NUMERIC(18,2), [PX_VOLUME])) OVER(PARTITION BY COMPANY ORDER BY [date] ROWS BETWEEN 3 PRECEDING AND CURRENT ROW), 2) AS monthrolling
    INTO dbo.[Equity_Indicators_window]
    FROM dbo.[Equity_Indicators_V1]
    GROUP BY [Company], 
             [date], 
             [PX_VOLUME]
    ORDER BY [date];
    

    【讨论】:

      猜你喜欢
      • 2021-06-04
      • 1970-01-01
      • 2015-03-07
      • 2015-02-12
      • 1970-01-01
      • 2018-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多