使用 T-SQL 消除前 10% 和后 10% 值进行平均计算

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。

Joh*_*tti 0

编辑以确保均匀的“发型”

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)