计算SQL Server中的平均值的平均值

时间:2019-12-29 11:24:02

标签: sql sql-server tsql

我想做一些非常简单的事情,但是显然我缺少技巧!我想获得平均值的平均值,但我想包括原始平均值计算的权重。我将使用尝试剥离的版本。

所以说我有下表

Product     date        RunInterval    AvgDuration_secs   Executions
--------------------------------------------------------------------
   A        29/12/19            1               1           100
   A        29/12/19            2               2            10

我想找出的是29/12产品A的平均持续时间。到目前为止,我尝试过的所有操作平均给我1.5秒,即将1秒和2秒的持续时间(3)相加,然后除以行数(2)得到1.5。我想要得到的是平均值,但考虑到它运行的频率,所以(100 * 1)+(10 * 2)/ 110 = 1.09秒。我已经尝试过用GROUP BY语句和CURSORS进行各种尝试,但没有达到目标。

我显然要用错误的方式解决它!欢迎任何帮助:-)

2 个答案:

答案 0 :(得分:3)

您可以这样做:

select product, date,
  round(1.0 * sum([Executions] * [AvgDuration_secs]) / sum([Executions]), 2) result
from tablename
group by product, date

我不确定您是要在第一笔款项中使用RunInterval还是AvgDuration_secs
请参见demo
结果:

> product | date      | result        
> :------ | :---------| :-----
> A       | 29/12/2019| 1.09

答案 1 :(得分:0)

如果从某个表中选择的查询或视图获得了这些结果,则可以按“产品&日期&RunInterval”进行分组。

然后,您可以在该表上简单地运行一个查询 仅按产品和日期分组。

示例:

--
-- Sample data
--
CREATE TABLE sometable
(
  Product varchar(30), 
  ExecutionDatetime datetime, 
  RunInterval int
);

WITH RCTE_NUMS AS
(
   SELECT 1 AS n

   UNION ALL
   SELECT n+1
   FROM RCTE_NUMS
   WHERE n < 110
)
INSERT INTO sometable
(Product, ExecutionDatetime, RunInterval) 
SELECT 
'A' p, 
DATEADD(minute,n*12,'2019-12-29 01:00:00') dt, 
IIF(n<=100,1,2) ri
FROM RCTE_NUMS
OPTION (MAXRECURSION 1000);
110 rows affected
select 
Product, 
cast(ExecutionDatetime as date) as [Date],
AVG(1.0*RunInterval) AS AvgDuration_secs,
COUNT(*) AS Executions
from sometable t
group by 
Product, 
cast(ExecutionDatetime as date)
ORDER BY Product, [Date]
Product | Date                | AvgDuration_secs | Executions
:------ | :------------------ | :--------------- | ---------:
A       | 29/12/2019 00:00:00 | 1.090909         |        110

db <>提琴here