U kunt een CTE (Common Table Expression) gebruiken in combinatie met de NTILE
vensterfunctie - dit zal uw gegevens in zoveel segmenten opdelen als u nodig heeft, b.v. in jouw geval in 20 plakjes (elk 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
Dit groepeert uw gegevens in principe op Category,Name
, bestellingen door iets anders (niet zeker of COUNT(Name)
is echt wat je hier wilt), en verdeelt het vervolgens in 20 stukken, die elk 5% van je gegevenspartitie vertegenwoordigen. Het segment met NTile = 1
is het bovenste 5% segment - negeer dat gewoon bij het selecteren uit de CTE.
Zie:
- MSDN-documenten op NTILE
- SQL Server 2005-rangschikkingsfuncties
- SQL SERVER – 2005 – Voorbeeldvoorbeeld van RANKING-functies – ROW_NUMBER, RANK, DENSE_RANK, NTILE
voor meer info