Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como seleciono TOP 5 PERCENT de cada grupo?


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:

para mais informações