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 パーセントを定義する方法と同数を処理する方法を正確に指定しません。

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 に答える