Взятие среднего по SQL после выбрасывания выбросов - PullRequest
0 голосов
/ 10 июня 2009

У меня есть общая таблица журнала, которую я могу прикрепить к процессам и их результатам. Я получаю среднее время, используя представление производительности процесса:

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 ]

3 голосов
/ 10 июня 2009

Агрегатные функции игнорируют NULL (кроме COUNT(*)), поэтому, если вы можете преобразовать выбросы в NULL в своем выражении, это поможет.

AVG( CASE WHEN Start.EventTime = Finish.EventTime THEN NULL
     ELSE DATEDIFF(SECOND, Start.EventTime, Finish.EventTime) 
     END CASE )
0 голосов
/ 10 июня 2009

Не проанализировав ваш запрос подробно, моя первая идея:

  • сделать ваш запрос в табличную переменную (или временно)
  • удалить выбросы из таблицы, используя любой показатель, который вы используете, чтобы определить выбросы
  • эта метрика может просто удалять все значения ниже или выше фиксированного порога
  • и / или сначала вычисляется среднее значение и stdev, а затем удаляются все записи на расстоянии больше чем x stdev от среднего значения
  • затем проведите дальнейший анализ очищенного соблазнителя
...