2012-04-24 2 views
2

Хотелось бы рассчитать год среднем, ситуация выглядит следующим образом.Как рассчитать среднее значение в год во вложенном запросе?

Plant_ID | Year | Month | MR | Range 
    CCAR | 2009 | 1  | 0,706 | Null 
    CCAR | 2009 | 2  | 0,626 | 0,08 
    CCAR | 2009 | 3  | 0,637 | 0,11 
    CCAR | 2009 | 4  | 0,737 | 0,1 
    CCAR | 2009 | 5  | 0,552 | 0,19 
    CCAR | 2009 | 6  | 0,418 | 0,137 
    CCAR | 2009 | 7  | 0,503 | 0,085 
    CCAR | 2009 | 8  | 0,645 | 0,058 
    CCAR | 2009 | 9  | 0,743 | 0,098 
    CCAR | 2009 | 10  | 0,556 | 0,187 
    CCAR | 2009 | 11  | 0,298 | 0,258 
    CCAR | 2009 | 12  | 0,339 | 0,041 
    CCAR | 2010 | 1  | 0,381 | 0,042 
    Etc. 

Я бы хотел добавить две колонки; 1 (aMR), который вычисляет средний MR (темп обслуживания) в год, поэтому один средний показатель за 2009 год, один за 2010 год и т. Д., А второй - вычисляет средний диапазон в год. Моя проблема в том, что я не знаю, где это сделать в моем запросе, потому что он немного усложнился, и я могу справиться ... Я уже сделал заявление, чтобы добавить colum aMR, который является средним значением MR (см. код запроса ниже). Но я не могу получить среднее значение в год (теперь он возвращает общее среднее значение всех значений MR). Может ли кто-нибудь помочь мне в этом?

WITH cte AS (
SELECT Plant_Id, 
     Jaar, 
     Maand, 
     (SUM(Compl) + 0.000)/SUM(Total) AS MR, 
     ROW_NUMBER() OVER (ORDER BY Jaar DESC, 
     Maand DESC) AS RowNumber 
FROM (SELECT Plant_Id, 
      Jaar, 
      Late, 
      EarlyJobs, 
      OnTimeJobs, 
      Maand, SUM(EarlyJobs +OnTimeJobs) AS Compl, 
      SUM(EarlyJobs) + SUM(Late) + SUM(OnTimeJobs) AS Total 
     FROM MaintenanceRatebepaen AS MaintenanceRatebepaen_1 
     GROUP BY Plant_Id, Jaar, Maand, Late, OnTimeJobs, EarlyJobs) AS MaintenanceRatebepaen 
WHERE (Jaar >= 2009) AND (Jaar <= 2011) AND (Plant_Id = 'CCAR') 
GROUP BY Jaar, Plant_Id, Maand) 

SELECT d1.Plant_Id, 
     d1.Jaar, 
     d1.Maand, 
     d1.MR, 
     abs(d1.MR - d2.MR) AS [ChangeMRFromPreviousMonth], 
     aMR =(SELECT avg(cte.MR) FROM cte) 
FROM cte d1 
LEFT OUTER JOIN cte d2 ON d2.RowNumber = (d1.RowNumber + 1) 
ORDER BY d1.Rownumber DESC 

Так что я хотел бы добавить две колонки; который вычисляет среднее значение MR (aMR) в год и второй столбец, который вычисляет средний диапазон в год. Может ли кто-нибудь помочь мне в этом? Я довольно новичок в SQL, и любая помощь будет принята с благодарностью!

ответ

0

Попробуйте заменить aMR =(SELECT avg(cte.MR) FROM cte) с

aMR = avg (d1.MR) over (partition by d1.Plant_Id, d1.Jaar, d1.Maand) 

Я неуверен о d1.Maand. Если это означает месяц, удалите его из раздела. Что касается диапазона (? Или изменения), можно также попробовать:

aChange = avg (d1.MR - d2.MR) over (partition by d1.Plant_Id, d1.Jaar, d1.Maand) 
+0

Brilliant !! Он работает, спасибо вам большое! Я пробовал это несколько дней. – Benne

0
SELECT 
    PLant_id 
    ,year 
    ,avg(mr) as avgMR 
    ,avg(range) as avgRange 
FROM 
    table 
GROUP BY 
    Plant_id,year 

вы могли бы присоединиться к этому, чтобы вычислить дисперсию или аналогичный

SELECT 
    t.* 
    ,c.* 
    ,t.mr - c.avgMR as MRvariance 
    ,t.Range - c.avgRange as RangeVariance 
FROM 
    table as t 
     INNER JOIN (
      SELECT 
       PLant_id 
       ,year 
       ,avg(mr) as avgMR 
       ,avg(range) as avgRange 
      FROM 
       table 
      GROUP BY 
       Plant_id,year 
    ) as c 
      ON c.plant_id = t.plant_id 
      AND c.year = t.year 
2

если вы можете получить к столу, как myTable (Plant_ID, Year, Month, MR, Range), вы уже сделали большую часть работы:

SELECT year, AVG(MR) AS "avg_mr", AVG(range) AS "avr_range" 
FROM myTable 
GROUP BY year; 

Если эти данные являются результатом сложного запроса просто замените этот имя гипотетической таблицы для запроса:

SELECT year, AVG(MR) AS "avg_mr", AVG(range) AS "avr_range" 
FROM (
    SELECT ... FROM ... -- complex query goes here 
) 
GROUP BY year; 
Смежные вопросы