Можете да използвате CTE (общ табличен израз) в двойка с NTILE
функция за прозорци - това ще раздели вашите данни на толкова части, колкото са ви необходими, напр. във вашия случай на 20 резена (всеки по 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
Това основно групира вашите данни по Category,Name
, поръчки от нещо друго (не съм сигурен дали COUNT(Name)
наистина е нещото, което искате тук), и след това го разделя на 20 части, всяка представляваща 5% от вашия дял с данни. Частта с NTile = 1
е най-горният дял от 5% - просто игнорирайте това, когато избирате от CTE.
Вижте:
- MSDN документи на NTILE
- функции за класиране на SQL Server 2005
- SQL SERVER – 2005 – Примерен пример за функции за РАНГИРАНЕ – ROW_NUMBER, RANK, DENSE_RANK, NTILE
за повече информация