2017-01-10 7 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

Я думаю, вы на самом деле хотите сгруппировать по идентификатору таким образом, как это: 'SELECT item, hrs = AVG (DATEDIFF (HOUR, dateSent, dateReceived)), freq = COUNT (*) FROM myTable GROUP BY item 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) –

Смежные вопросы