我有一个数据集,其中包括PRICE,SUBTYPE等。我想在使用数据集之前进行一些离群值去除。我想删除每个SUBTYPE中价格过高或过低的行。

对于每个子类型,请查看PRICE的范围,然后删除或过滤掉行。
保留介于以下之间的行:PRICErange * .01 | KEEP |价格范围* .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

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

最佳答案

您没有确切指定如何定义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) ,但是如果行数相对于存储桶数较小,则它在存储桶之间的分布不佳。

07-24 09:51
查看更多