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:
- Documenti MSDN su NTILE
- Funzioni di classificazione di SQL Server 2005
- SQL SERVER – 2005 – Esempio di esempio di funzioni RANKING – ROW_NUMBER, RANK, DENSE_RANK, NTILE
per maggiori informazioni