如何在SQL中过滤每组中前1%和下1%的数据

Bra*_*ith 7 sql sql-server-2008

我有一个数据集,包括PRICE,SUBTYPE和其他.我想在使用数据集之前先删除异常值.我希望在每个SUBTYPE中删除价格高得离谱或低价的行.

对于每个SUBTYPE,查看PRICE的范围并删除或过滤掉行.保持介于两者之间的行:PRICErange*.01 | KEEP | PRICErange*.99

这是由Martin Smith在stackoverflow上提供给我的,我编辑了这个问题,所以让我们从这里开始.

;WITH CTE       
AS (SELECT *,                   
ROW_NUMBER() OVER (PARTITION BY SUBTYPE ORDER BY PRICE) AS RN,                    
COUNT(*) OVER(PARTITION BY SUBTYPE) AS Cnt             
FROM    all_resale)    
SELECT *    
FROM   CTE    
WHERE (CASE WHEN Cnt > 1 THEN 100.0 * (RN -1)/(Cnt -1) END) BETWEEN 1 AND 99
Run Code Online (Sandbox Code Playgroud)

我不确定这是我需要做的.我不知道将从末端删除多少行.

Mar*_*ith 5

您没有准确指定如何定义1%以及如何处理关系.

一种方法如下

;WITH CTE
     AS (SELECT *,
                ROW_NUMBER() OVER (PARTITION BY SUBTYPE ORDER BY PRICE) AS RN,
                COUNT(*) OVER(PARTITION BY SUBTYPE) AS Cnt
         FROM    all_resale)
SELECT *
FROM   CTE
WHERE (CASE WHEN Cnt > 1 THEN 100.0 * (RN -1)/(Cnt -1) END) BETWEEN 1 AND 99
Run Code Online (Sandbox Code Playgroud)

这假设最高价格项目是100%最低价格0%,所有其他价格均衡在不考虑关系之间.如果你需要考虑关系RANK而不是ROW_NUMBER

注意:如果所有的子类型都有相对大量的行,你可以使用NTILE(100)它,但如果行数相对于桶的数量很小,它就不会在桶之间分配.