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)
我不确定这是我需要做的.我不知道将从末端删除多少行.
您没有准确指定如何定义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)它,但如果行数相对于桶的数量很小,它就不会在桶之间分配.