sql*_*int 5 t-sql sql-server percentile sql-server-2014
我需要计算正在运行的存储过程之一的平均持续时间。例如SP的持续时间(以秒为单位)为:1,30,2,5,2,15,35,7,3,4,2,1,2,40
我必须消除前 10% 的调用(快速调用)和后 10% 的调用(慢速调用)并计算其余调用的平均值。
由于必须定期在庞大的数据集上完成此操作,是否有更好的方法可以最大限度地减少性能损失?
我知道的方法是:
使用以下查询消除前 10% 的记录,该查询会产生两个值 (1,1)
SELECT TOP 10 PERCENT WITH TIES value FROM #t order by value asc
Run Code Online (Sandbox Code Playgroud)
底部 10% 给出 (35,40),
SELECT TOP 10 PERCENT WITH TIES value FROM #t order by value desc
Run Code Online (Sandbox Code Playgroud)
消除这些值(1、1、35 和 40)后,平均值将为 7。
编辑以确保均匀的“发型”
Declare @YourTable table (Seconds int)
Insert Into @YourTable values
(1),(30),(2),(5),(2),(15),(35),(7),(3),(4),(2),(1),(2),(40)
Select AvgSeconds = avg(Seconds)
From (
Select *
,Dec1 = NTile(10) over (Order By Seconds)
,Dec2 = NTile(10) over (Order By Seconds Desc)
From @YourTable
) A
Where Dec1 between 2 and 9
and Dec2 between 2 and 9
Run Code Online (Sandbox Code Playgroud)
退货
AvgSeconds
7
Run Code Online (Sandbox Code Playgroud)