Bạn có thể sử dụng CTE (Biểu thức bảng chung) được ghép nối với NTILE
chức năng cửa sổ - điều này sẽ chia nhỏ dữ liệu của bạn thành nhiều phần tùy thích, ví dụ:trong trường hợp của bạn, thành 20 phần (mỗi phần 5%).
;WITH SlicedData AS
(
SELECT Category, Name, COUNT(Name) Total,
NTILE(20) OVER(PARTITION BY Category ORDER BY COUNT(Name) DESC) AS 'NTile'
FROM #TEMP
GROUP BY Category, Name
)
SELECT *
FROM SlicedData
WHERE NTile > 1
Về cơ bản, điều này sẽ nhóm dữ liệu của bạn theo Category,Name
, đơn đặt hàng của người khác (không chắc chắn nếu COUNT(Name)
thực sự là thứ bạn muốn ở đây), và sau đó cắt nó thành 20 phần, mỗi phần đại diện cho 5% phân vùng dữ liệu của bạn. Phần với NTile = 1
là phần 5% hàng đầu - chỉ cần bỏ qua phần đó khi chọn từ CTE.
Xem:
- Tài liệu MSDN trên NTILE
- Chức năng xếp hạng SQL Server 2005
- SQL SERVER - 2005 - Ví dụ mẫu về hàm RANKING - ROW_NUMBER, RANK, DENSE_RANK, NTILE
để biết thêm thông tin