7

我有一个包含 PRICE、SUBTYPE 等的数据集。我想在使用数据集之前做一些异常值删除。我想在每个 SUBTYPE 中删除价格高得离谱或低得离谱的东西的行。

对于每个 SUBTYPE,查看 PRICE 的范围并删除或过滤掉行。保留介于以下之间的行:PRICErange * .01 |KEEP| 价格范围 * .99

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

;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

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

4

1 回答 1

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

假设最高价格项目是100%,最低价格项目0%和所有其他项目在不考虑关系的情况下均匀缩放。如果您需要考虑关系,请查看RANK而不是ROW_NUMBER

注意:如果所有子类型都有相对大量的行,您可以NTILE(100)改用,但如果行数相对于存储桶数而言较小,则它不会很好地分布在存储桶之间。

于 2013-06-14T13:05:36.203 回答