2013-06-14 9 views
7

Mam zestaw danych, który obejmuje PRICE, SUBTYPE i inne. Chcę usunąć niektóre z nich, zanim użyję zestawu danych. Chcę usunąć wiersze dla rzeczy, których cena jest absurdalnie wysoka lub niska, w każdym SUBTYPE.Jak filtrować górny 1% i 1% mniej danych w każdej grupie w SQL

Dla każdego SUBTYPE patrzeć na zakres cen i usuwać lub odfiltrowywać wiersze. Zachowaj wiersze między: PRICErange * .01 | KEEP | PRICErange * .99

Zostało to dostarczone przez Martina Smitha na stackoverflow, zredagowałem to pytanie, więc zacznijmy od tego.

;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 

Nie jestem pewien, czy to jest to, co muszę zrobić. Nie wiem, ile rzędów zostanie usuniętych z końców.

+3

Kiedy mówisz "Usuń", masz na myśli filtr lub usunąć? – KingCronus

+1

ALBO "Top 1% posortowanej CENY" jest niejednoznaczne - czy chcesz zmniejszyć liczbę rekordów o 1%? –

+0

Filtr. Chciałbym, aby pozostało w zbiorze danych, ale nie pojawi się w tym zapytaniu. Próbuję zrobić trochę więcej kontroli, ale także mogę wrócić i ponownie przeprowadzić proces z wartościami odstającymi. Z drugiej strony, jeśli dane wyjściowe zostały umieszczone w nowej tabeli, można je całkowicie usunąć w nowej tabeli. –

Odpowiedz

5

Nie określasz dokładnie, jak definiujesz 1 procent i jak należy obsługiwać krawaty.

Jednym ze sposobów jest poniżej

;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 

który zakłada najwyższa pozycja cena jest 100%, najniższą cenę jednego 0% a wszyscy inni skalowane równomiernie między sobą nie uwzględnia więzi. Jeśli trzeba uwzględniać więzi spojrzeć RANK zamiast ROW_NUMBER

NB: W przypadku wszystkich podtypów mają stosunkowo dużą ilość wierszy można użyć NTILE(100) zamiast ale nie rozprowadzać między wiadrami dobrze, jeśli liczba wierszy jest mały w stosunku do liczby wiader.

Powiązane problemy