Můžete použít CTE (Common Table Expression) spárovaný s NTILE
funkce okna – tato rozdělí vaše data na tolik řezů, kolik potřebujete, např. ve vašem případě na 20 plátků (každý po 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
To v podstatě seskupuje vaše data podle Category,Name
, objednává podle něčeho jiného (nejsem si jistý, zda COUNT(Name)
je opravdu to, co zde chcete), a poté jej rozřeže na 20 kusů, z nichž každý představuje 5 % vašeho datového oddílu. Řez s NTile = 1
je horních 5 % - to při výběru z CTE ignorujte.
Viz:
- Dokumenty MSDN na NTILE
- Hodnocení funkcí SQL Server 2005
- SQL SERVER – 2005 – Ukázkový příklad funkcí RANKING – ROW_NUMBER, RANK, DENSE_RANK, NTILE
pro více informací