Sie könnten einen CTE (Common Table Expression) zusammen mit dem NTILE
verwenden Windowing-Funktion - diese zerlegt Ihre Daten in so viele Slices wie Sie brauchen, z.B. in Ihrem Fall in 20 Scheiben (je 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
Dies gruppiert Ihre Daten grundsätzlich nach Category,Name
, Bestellungen von etwas anderem (nicht sicher, ob COUNT(Name)
ist wirklich das, was Sie hier wollen) und zerlegt es dann in 20 Teile, die jeweils 5 % Ihrer Datenpartition darstellen. Das Slice mit NTile = 1
ist der oberste 5 %-Slice - ignorieren Sie das einfach bei der Auswahl aus dem CTE.
Siehe:
- MSDN-Dokumentation auf NTILE
- Ranking-Funktionen von SQL Server 2005
- SQL SERVER – 2005 – Beispielbeispiel für RANKING-Funktionen – ROW_NUMBER, RANK, DENSE_RANK, NTILE
für weitere Informationen