Sql 如何计算嵌套查询中每年的平均值?
我想计算一年的平均值,情况如下Sql 如何计算嵌套查询中每年的平均值?,sql,average,Sql,Average,我想计算一年的平均值,情况如下 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 |
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.
我想增加两栏;1aMR用于计算每年的平均MR维护率,因此一个用于2009年、一个用于2010年等,第二个用于计算每年的平均范围。我的问题是,我不知道在我的查询中该在哪里做,因为它变得有点复杂,我无法处理。。。。我已经声明添加了ColumAMR,这是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非常陌生,任何帮助都将不胜感激 尝试用替换aMR=从cte中选择avgcte.MR
我不确定d1.Maand。如果它表示月份,请按从分区中删除它。至于范围或更改?,您也可以尝试:
aChange = avg (d1.MR - d2.MR) over (partition by d1.Plant_Id, d1.Jaar, d1.Maand)
然后,您可以加入此计算方差或类似值
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
如果您可以访问myTable Plant_ID、年、月、MR、范围等表格,您已经完成了大部分工作:
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;
明亮的很有效,非常感谢!我已经试了好几天了。
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;