我正在创建一个比较各个单位的总时间和数量的报告。这里是我目前正在使用的查询的简化:
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
但是,有人告诉我,我需要排除行的时间在最高或最低5%的情况下,以消除一些古怪的异常值。 (与之类似,在应用聚合之前,请删除行。)
我怎么做?
最佳答案
您可以使用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
编辑:这个article也有几种技术
关于sql-server - 如何从聚合查询中排除异常值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4717489/