2013-06-14 22 views
7

Tôi có tập dữ liệu bao gồm PRICE, SUBTYPE và các tập dữ liệu khác. Tôi muốn làm một số loại bỏ ngoại lệ trước khi tôi sử dụng tập dữ liệu. Tôi muốn xóa các hàng cho những thứ có giá cực kỳ cao hoặc thấp, trong mỗi SUBTYPE.Làm cách nào để lọc 1% trên cùng và 1% dữ liệu thấp hơn trong mỗi nhóm trong SQL

Đối với mỗi SUBTYPE, hãy xem phạm vi của PRICE và xóa hoặc lọc ra các hàng. Giữ các hàng nằm trong khoảng: PRICErange * .01 | KEEP | PRICErange * .99

Điều này được cung cấp cho tôi bởi Martin Smith trên stackoverflow, tôi đã chỉnh sửa câu hỏi này, vì vậy hãy bắt đầu từ đây.

;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 

Tôi không chắc đây là những gì tôi cần làm. Tôi không biết có bao nhiêu hàng sẽ bị loại bỏ khỏi đầu.

+3

Khi bạn nói "Xóa", bạn có nghĩa là lọc hoặc xóa? – KingCronus

+1

ALso '1% hàng đầu được sắp xếp PRICE' không rõ ràng - bạn có muốn giảm số lượng bản ghi xuống 1% không? –

+0

Bộ lọc. Tôi muốn nó ở lại trong tập dữ liệu, nhưng không hiển thị trong truy vấn này. Tôi đang cố gắng thực hiện một số kiểm soát ngoại lệ, nhưng cũng có thể quay lại và thực hiện lại quy trình với các ngoại lệ. Mặt khác, nếu đầu ra được đưa vào một bảng mới, thì nó có thể bị xóa hoàn toàn trong bảng mới. –

Trả lời

5

Bạn không chỉ định chính xác cách bạn xác định 1% và cách xử lý mối quan hệ.

Một cách là bên dưới

;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 

Đó là giả định mục mức giá cao nhất là 100%, giá thấp nhất 0% và tất cả những người khác có quy mô đều cho hai dùng không có tài khoản của các mối quan hệ. Nếu bạn cần tính đến các mối quan hệ, hãy xem xét RANK thay vì ROW_NUMBER

Lưu ý: Nếu tất cả các loại phụ có số lượng hàng tương đối lớn, bạn có thể sử dụng NTILE(100) thay vào đó. nhỏ so với số lượng nhóm.

Các vấn đề liên quan