2017-01-10 72 views
4

我想根據以下計算來計算加權平均數。在SQL Server中計算加權平均數

我有一個數據集,看起來是這樣的:

item |  Date Sent  |  Date Received 
1 |  2 Feb 10am |  3 Feb 10am 
1 |  6 Feb 11am |  6 Feb 12pm 
2 |  2 Feb 10am |  3 Feb 10am 
2 |  6 Feb 11am |  6 Feb 12pm 

然後我需要計算基礎上的時間差平均四捨五入意思是:

Time Diff | Count | 
    1  | 2 | 
    12  | 2 | 

所以在這種情況下,它會是:

1 * 2 + 12 * 2/(12 + 1) 

我已經編寫了SQL查詢來計算聚合表:

select 
    floor(datediff(hh, dateSent, dateReceived)) as hrs, 
    count(item) as freq 
from 
    table 
group by 
    floor(datediff(hh, dateSent, dateReceived)) 
having 
    floor(datediff(hh, dateSent, dateReceived)) < 100 
order by 
    floor(datediff(hh, dateSent, dateReceived)) asc; 

我應該做一個子查詢嗎?我不熟練,我嘗試過,但不斷收到語法錯誤。

有人可以幫助我得到SQL查詢來獲得加權平均值嗎?

+0

我的猜測是你真正想要組通過這樣的方式ID: 'SELECT item,hrs = AVG(DATEDIFF(HOUR,dateSent,dateReceived)),freq = COUNT(*)FROM myTable GROUP BY項目HAVING AVG(DATEDIFF(HOUR,dateSent,dateReceived))<100 ORDER BY 2;'像那樣? – ZLK

+0

我實際上想要得到加權平均數,我認爲這將是子查詢的一部分,但我沒有設法完成。你爲什麼要訂購2? –

+0

我不確定你的意思是「加權平均」。它是如何「加權」的?另外,'2號'順序只是懶惰的短語,說「按第二列排序」。 – ZLK

回答

4

如果你所說的「加權平均」的意思是平均的所有時間的差異,那麼下面可能會有所幫助:

select AVG(a.hrs) 
from 
(
    select floor(datediff(hh,dateSent,dateReceived)) as hrs, 
    count(item) as freq from table 
     group by floor(datediff(hh,dateSent,dateReceived)) 
      having floor(datediff(hh,dateSent,dateReceived)) <100 
--    order by floor(datediff(hh,dateSent,dateReceived)) asc 
) a 
+0

是的,這非常接近謝謝!我不知道你可以做到這一點。我的最終結果只是選擇和(a.hrs * a.freq)/ sum(a.freq)而不是AVG(a.hrs) –