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

标签 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

但是,有人告诉我,我需要排除行的时间在最高或最低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/

相关文章:

c# - 没有主键时如何防止使用SqlBulkCopy插入重复记录

安装 SQL Server Management Studio 后,SQL Server 服务在服务列表中不可用

sql - nvarchar(4001)?

sql-server - 如何在 SQL Server 2008 Express 中使用 SQL Server Management Studio 启用全文索引?

SQL Server : "Conversion failed when converting datetime from character string."

.net - 无法加载DLL 'SqlServerSpatial.dll'

sql - 使用 select 和 group by 的简单 SQL 查询

sql-server - 为什么我们需要CDC或CT才能在SQL Server 2016中要求时态表?

sql - 尽管数据库和服务器排序规则是 CI,但分组依据在 T-SQL 中区分大小写

SQL Server 查询以查找成员注册的年数