Du kan bruge en CTE (Common Table Expression) parret med NTILE
vinduesfunktion - dette vil dele dine data op i lige så mange skiver som du har brug for, f.eks. i dit tilfælde i 20 skiver (hver 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
Dette grupperer grundlæggende dine data efter Category,Name
, bestiller efter noget andet (ikke sikker på om COUNT(Name)
er virkelig den ting, du vil have her), og skærer den derefter op i 20 stykker, der hver repræsenterer 5 % af din datapartition. Udsnittet med NTile = 1
er den øverste 5% skive - bare ignorer det, når du vælger fra CTE.
Se:
- MSDN-dokumenter på NTILE
- SQL Server 2005-rangeringsfunktioner
- SQL SERVER – 2005 – Eksempel på RANKING-funktioner – ROW_NUMBER, RANK, DENSE_RANK, NTILE
for mere info