【问题标题】:Calculate Weighted Average in SQL Server在 SQL Server 中计算加权平均值
【发布时间】:2017-01-11 14:16:35
【问题描述】:

我正在尝试根据以下计算计算加权平均值。

我有一个如下所示的数据集:

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 查询以获取加权平均值吗?

【问题讨论】:

  • 我猜你真的想按 ID 以这样的方式分组:SELECT item, hrs = AVG(DATEDIFF(HOUR, dateSent, dateReceived)), freq = COUNT(*) FROM myTable GROUP BY item HAVING AVG(DATEDIFF(HOUR, dateSent, dateReceived)) &lt; 100 ORDER BY 2; 或类似的方式?
  • 我实际上想要获得加权平均值,我认为这将是子查询的一部分,但我还没有设法完成它。你为什么要在 2 点前下单?
  • 我不确定您所说的“加权平均”是什么意思。它是如何“加权”的?此外,order by 2 只是懒惰的速记“按第二列排序”。
  • 加权是由问题中发布的第二个表中的计数完成的。所以权重将是 Time Diff 值。

标签: sql-server tsql


【解决方案1】:

如果您所说的“加权平均”是所有时间差的平均值,那么以下内容可能会有所帮助:

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

【讨论】:

  • 是的,这已经足够接近了,谢谢!我不知道你能做到这一点。我的最终结果只是选择 sum(a.hrs*a.freq)/sum(a.freq) 而不是 AVG(a.hrs)
猜你喜欢
  • 1970-01-01
  • 2017-04-22
  • 1970-01-01
  • 2013-01-22
  • 2016-12-14
  • 2021-11-21
  • 1970-01-01
  • 1970-01-01
  • 2021-11-24
相关资源
最近更新 更多