SQL

2013-06-14 8 views
7

'daki her bir gruptaki verilerin en üst% 1'ini ve daha düşük% 1'ini nasıl filtreleyebilirim PRICE, SUBTYPE ve diğerlerini içeren bir veri kümem var. Veri kümesini kullanmadan önce ayırı kaldırmayı yapmak istiyorum. Her SUBTYPE'de fiyatın gülünç derecede yüksek veya düşük olduğu şeyler için satırları kaldırmak istiyorum.SQL

Her SUBTYPE için FIYATLAR aralığına bakın ve satırları kaldırın veya filtreleyin. Aradaki boşlukları koru: PRICErange * .01 | KEEP | PRICErange * .99

Bu, bana bir Martin Smith tarafından stackoverflow üzerinde sağlandı, ben bu soruyu düzenledim, bu yüzden buradan başlayalım.

;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 

Yapmam gerekenin bu olduğundan emin değilim. Sonunda kaç satırın kaldırılacağını bilmiyorum.

+3

"Kaldır" derken filtreyi mi yoksa silmek mi? – KingCronus

+1

ALso 'Sıralı PRICE' in% 1'i belirsizdir - kayıt sayısını% 1 oranında azaltmak ister misiniz? –

+0

Filtre. Veri kümesinde kalmasını isterim, ancak bu sorguda görünmez. Ben bazı aykırı kontrol yapmaya çalışıyorum, ama aynı zamanda geri gider ve aykırı ile tekrar işlem yapabilirsiniz. Öte yandan, çıktı yeni bir masaya konulduysa, yeni tabloda tamamen silinebilir. –

cevap

5

Tam olarak yüzde 1'i nasıl tanımladığınız ve ilişkilerin nasıl ele alınması gerektiğini belirtmezsiniz.

bir yolu, en yüksek fiyat öğesi 100% olan en düşük fiyatı tek 0% ve bağların dikkate alınmayacaktır arasında eşit ölçekli diğerlerini varsayar

;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 

altındadır. Eğer bağları göz önünde gerekiyorsa RANK yerine

ROW_NUMBER daha NB içine bakmak: alt tiplerinin her satır nispeten büyük miktarda varsa bunun yerine NTILE(100) kullanabilirsiniz ama bu kova kuyu eğer satır sayısı arasındaki dağıtmaz kepçelerin sayısına nispeten küçüktür.