我有一个数据集,其中包括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)
,但是如果行数相对于存储桶数较小,则它在存储桶之间的分布不佳。