2009-06-09 39 views
0

我有一个通用日志表,可以附加到进程及其结果。我使用过程中性能视图得到的平均时间:在抛出异常值之后取出SQL中的平均值

WITH Events 
      AS (
       SELECT PR.DATA_DT_ID 
         ,P.ProcessID 
         ,P.ProcessName 
         ,PL.GUID 
         ,PL.EventText 
         ,PL.EventTime 
       FROM  MISProcess.ProcessResults AS PR 
       INNER JOIN MISProcess.ProcessResultTypes AS PRT 
         ON PRT.ResultTypeID = PR.ResultTypeID 
          AND PRT.IsCompleteForTiming = 1 
       INNER JOIN MISProcess.Process AS P 
         ON P.ProcessID = PR.ProcessID 
       INNER JOIN MISProcess.ProcessLog AS PL 
         ON PL.BatchRunID = PR.BatchRunID 
          AND PL.ProcessID = P.ProcessID 
          AND [GUID] IS NOT NULL 
          AND (
           PL.EventText LIKE 'Process Starting:%' 
           OR PL.EventText LIKE 'Process Complete:%' 
           ) 
      ) 
SELECT Start.DATA_DT_ID 
     ,Start.ProcessName 
     ,AVG(DATEDIFF(SECOND, Start.EventTime, Finish.EventTime)) AS AvgDurationSeconds 
     ,COUNT(*) AS NumRuns 
FROM Events AS Start 
INNER JOIN Events AS Finish 
     ON Start.EventText LIKE 'Process Starting:%' 
      AND Finish.EventText LIKE 'Process Complete:%' 
      AND Start.DATA_DT_ID = Finish.DATA_DT_ID 
      AND Start.ProcessID = Finish.ProcessID 
      AND Start.GUID = Finish.GUID 
GROUP BY Start.DATA_DT_ID 
     ,Start.ProcessName 

的GUID链接除其他“音符”式条目的开始和结束条目。比如说,我可以过滤掉旧的月份,因此一个过程的平均性能只能在过去3个月内完成。

当我由于性能不佳或调试而导致异常值出现时,问题就出现了,该过程在0秒内完成,或者其他任何情况。

我想以某种方式自动消除任何异常值。

VAR()STDEV()集合函数是否有效?

+2

这里的问题是自动定义什么是“异常”的,这就是主要的统计问题。 – RBarryYoung 2009-06-09 23:25:12

回答

3

集合函数忽略NULL(除了COUNT(*)),所以如果你可以在你的表达式中将离群值转换为NULL,那会有所帮助。

AVG(CASE WHEN Start.EventTime = Finish.EventTime THEN NULL 
    ELSE DATEDIFF(SECOND, Start.EventTime, Finish.EventTime) 
    END CASE) 
+3

任何临时观察者的注意事项:Count(field_name)将忽略NULL。 – Eric 2009-06-09 23:18:43

0

无需解析查询详细,我的第一个想法是:

  • 做你的查询到一个表变量(或不是Temptable)
  • 使用任何一种指标中删除从表中的异常值用于定义异常值
  • 此度量标准可能只是删除低于或高于固定阈值的所有值
  • 和/或首先计算均值和stdev,然后删除所有的值S比大于x STDEV从平均
  • 走然后做进一步的分析,对清理不是Temptable