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.  

2 つの列を追加したいと思います。1 年あたりの平均 MR (Maintenance Rate) を計算する 1(aMR)、つまり 2009 年の平均、2010 年の平均など、1 年あたりの平均範囲を計算する 2 つ目。私の問題は、クエリでこれを行う場所がわからないことです。これは、処理できるよりも少し複雑になったためです.... MR の平均である列 aMR を追加するステートメントを既に作成しました (以下のクエリコード)。しかし、私は年ごとの平均を取得できません (現在、すべての 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  

だから私が望むのは、2 つの列を追加することです。1 つは 1 年あたりの MR (aMR) の平均を計算し、もう 1 つは 1 年あたりの平均範囲を計算する列です。誰でもこれで私を助けてもらえますか? 私はSQLにかなり慣れていないので、どんな助けでも大歓迎です!

4

3 に答える 3

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;
于 2012-04-24T13:53:12.777 に答える
0

で置き換えaMR =(SELECT avg(cte.MR) FROM cte)てみてください

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

d1.Maand については不明です。月を意味する場合は、partition by から削除します。Range (または Change?) については、次のことも試してみてください。

aChange = avg (d1.MR - d2.MR) over (partition by d1.Plant_Id, d1.Jaar, d1.Maand)
于 2012-04-24T09:44:59.853 に答える
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
于 2012-04-24T09:52:47.727 に答える