如何从聚合查询中排除异常值?

Mar*_*ret 3 sql-server

我正在创建一份报告,比较不同单位的总时间和数量.这里简化了我目前正在使用的查询:

SELECT  m.Unit,
        COUNT(*) AS Count,
        SUM(m.TimeInMinutes) AS TotalTime
FROM    main_table m
WHERE   m.unit <> ''
        AND m.TimeInMinutes > 0
GROUP BY m.Unit
HAVING  COUNT(*) > 15
Run Code Online (Sandbox Code Playgroud)

但是,有人告诉我,我需要排除行的时间最高或最低5%的情况,以试图摆脱一些古怪的异常值.(如在应用聚合之前删除行.)

我怎么做?

gbn*_*gbn 10

您可以使用NTILE排除顶部和底部x百分位数

SELECT m.Unit,
        COUNT(*) AS Count,
        SUM(m.TimeInMinutes) AS TotalTime
FROM    
        (SELECT
             m.Unit,
             NTILE(20) OVER (ORDER BY m.TimeInMinutes) AS Buckets
         FROM
             main_table m
         WHERE
             m.unit <> '' AND m.TimeInMinutes > 0
        ) m
WHERE   
      Buckets BETWEEN 2 AND 19
GROUP BY m.Unit
HAVING  COUNT(*) > 15
Run Code Online (Sandbox Code Playgroud)

编辑:这篇文章也有几种技巧