我想做一些非常简单的事情,但是显然我缺少技巧!我想获得平均值的平均值,但我想包括原始平均值计算的权重。我将使用尝试剥离的版本。
所以说我有下表
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进行各种尝试,但没有达到目标。
我显然要用错误的方式解决它!欢迎任何帮助:-)
答案 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