Você pode usar um CTE (Common Table Expression) emparelhado com o
NTILE
função de janela - isso dividirá seus dados em quantas fatias você precisar, por exemplo no seu caso, em 20 fatias (cada 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
Isso basicamente agrupa seus dados por
Category,Name
, pedidos por outra coisa (não tenho certeza se COUNT(Name)
é realmente o que você quer aqui) e depois o divide em 20 partes, cada uma representando 5% de sua partição de dados. A fatia com NTile = 1
é a fatia de 5% superior - apenas ignore isso ao selecionar no CTE. Ver:
- documentos do MSDN em NTILE
- Funções de classificação do SQL Server 2005
- SQL SERVER – 2005 – Exemplo de exemplo de funções de RANKING – ROW_NUMBER, RANK, DENSE_RANK, NTILE
para mais informações