Ошибка при вычислении 4-дневного скользящего среднего в SQL - PullRequest
0 голосов
/ 03 октября 2018

Я пытаюсь вычислить 4-дневное скользящее среднее в SQL.У меня есть дата в формате ниже.В моей таблице много компаний.Я должен рассчитать средний прокат отдельно для каждой компании.Но мой следующий запрос выполняет скользящий средний без дифференциации компаний.

Пожалуйста, исправьте мой запрос.Ожидаемый результат ниже:

  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

Ответы [ 3 ]

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

Ваша проблема - px_volume в group by.Я думаю, что вы намереваетесь:

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]     
0 голосов
/ 03 октября 2018

попробуйте следующее (вам нужно взять компанию в раздел по пунктам):

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];
0 голосов
/ 03 октября 2018

Ваш запрос трудно прочитать. В этом случае я рекомендую вам использовать CTE AND. В предложении over over используйте раздел по

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 

Попробуйте сделать это по шагам

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