Du kan använda ett CTE (Common Table Expression) parat med NTILE
fönsterfunktion - detta kommer att dela upp din data i så många skivor som du behöver, t.ex. i ditt fall, i 20 skivor (vardera 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
Detta grupperar i princip dina data efter Category,Name
, beställer av något annat (osäker på om COUNT(Name)
är verkligen det du vill ha här), och delar sedan upp det i 20 bitar, som var och en representerar 5 % av din datapartition. Snittet med NTile = 1
är den översta 5%-delen - ignorera bara det när du väljer från CTE.
Se:
- MSDN-dokument på NTILE
- SQL Server 2005-rankningsfunktioner
- SQL SERVER – 2005 – Exempel på RANKNING-funktioner – ROW_NUMBER, RANK, DENSE_RANK, NTILE
för mer information