Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come faccio a selezionare il TOP 5 PERCENT da ciascun gruppo?

Potresti usare un CTE (Common Table Expression) abbinato a NTILE funzione di windowing - questo suddividerà i tuoi dati in tutte le sezioni di cui hai bisogno, ad es. nel tuo caso, in 20 fette (ciascuna del 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

Questo fondamentalmente raggruppa i tuoi dati per Category,Name , ordini da qualcos'altro (non sono sicuro se COUNT(Name) è davvero la cosa che vuoi qui), quindi lo taglia in 20 pezzi, ciascuno dei quali rappresenta il 5% della tua partizione di dati. La sezione con NTile = 1 è la parte superiore del 5%:ignorala quando selezioni dal CTE.

Vedi:

per maggiori informazioni