0

КОД:SQL Server 2012 Перед переездом

SELECT YEAR_ID, Count, ThreeYEARAverage, 
     AVG(Count) OVER (ORDER BY YEAR_ID ROWS 4 PRECEDING) AS FiveYEARAverage 
FROM (SELECT YEAR_ID, ISNULL(Count, 0) AS Count, 
      AVG(ISNULL(Count, 0)) OVER (ORDER BY YEAR_ID ROWS 2 PRECEDING) AS ThreeYEARAverage 
     FROM (SELECT DATEPART(YEAR, Date_plan) AS YEAR_ID, 
      SUM(ISNULL(Amount_produced, 0)) AS Count 
      FROM History_mango 
      WHERE DATEPART(YEAR, Date_plan) BETWEEN '2012' AND '2016' 
        AND DATEPART(month, Date_plan) = '09' 
      GROUP BY DATEPART(YEAR, Date_plan)) AS id 
    ) AS id1 

Результат

YEAR_ID Count ThreeYEARAverage FiveYEARAverage 
2012 22 22.000000   22.000000 
2013 555 288.500000  288.500000 
2014 100 225.666666  225.666666 
2015 88 247.666666  191.250000 
2016 200 129.333333  193.000000 

потребность

YEAR_ID Count ThreeYEARAverage FiveYEARAverage 
2012 22 
2013 555 
2014 100 225.666666  
2015 88 247.666666 
2016 200 129.333333  193.000000 

спасибо дорогой

+0

'DATEPART()' возвращает целочисленное значение - я не уверен, что это будет переведено на символ (медленное) или значения символа будут переведены на целое (быстрое) - вы должны использовать целочисленное значение для сравнения. Использование «BETWEEN» следует избегать в пользу явных диапазонов (и обычно с эксклюзивной верхней границей). Я не считаю, что здесь требуется ISNULL() '(особенно в' SUM() '). Вероятно, вы можете запустить обе средние значения на одном уровне вложенности. Лучше всего показывать, как вы хотите, использовать 'LAG()', чтобы сохранить «самый ранний» год, а 'CASE' - текущий год. –

ответ

0

Я не SQL Server 2012 на чтобы проверить это, но следующее должно работать:

SELECT YEAR_ID, Count, 
     (case when count(*) over (rows 2 preceding) >= 3 
      then AVG(ISNULL(Count, 0)) OVER (ORDER BY YEAR_ID ROWS 2 PRECEDING) 
     end) AS ThreeYEARAverage, 
     (case when count(*) over (rows 4 preceding) 
      then AVG(Count) OVER (ORDER BY YEAR_ID ROWS 4 PRECEDING 
     end) AS FiveYEARAverage 
FROM (SELECT DATEPART(YEAR, Date_plan) AS YEAR_ID, 
      SUM(coalesce(Amount_produced, 0)) AS Count 
     FROM History_mango 
     WHERE DATEPART(YEAR, Date_plan) BETWEEN '2012' AND '2016' AND DATEPART(month, Date_plan) = '09' 
     GROUP BY DATEPART(YEAR, Date_plan) 
    ) id 

Он подсчитывает число в каждой группе. Если их достаточно, то отображается среднее значение.

Кстати, как правило, плохая идея использовать зарезервированное слово, например count, как имя переменной. Кроме того, coalesce является стандартным SQL, тогда как isnull нет. И это предполагает, что у вас есть данные за каждый год.