Możesz użyć CTE (Common Table Expression) w połączeniu z NTILE
funkcja okienkowania - podzieli twoje dane na tyle wycinków, ile potrzebujesz, np. w twoim przypadku na 20 plasterków (każdy 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 zasadniczo grupuje twoje dane według Category,Name
, zamówienia według czegoś innego (nie jestem pewien, czy COUNT(Name)
jest naprawdę tym, czego chcesz tutaj), a następnie dzieli go na 20 części, z których każda reprezentuje 5% partycji danych. Wycinek z NTile = 1
to górna część 5% - po prostu zignoruj to, wybierając z CTE.
Zobacz:
- Dokumentacja MSDN w NTILE
- Funkcje rankingowe SQL Server 2005
- SQL SERVER – 2005 – Przykładowy przykład funkcji RANKING – ROW_NUMBER, RANK, DENSE_RANK, NTILE
po więcej informacji