Podría usar una CTE (expresión de tabla común) emparejada con NTILE
función de ventana:esto dividirá sus datos en tantos segmentos como necesite, p. en tu caso, en 20 lonchas (cada una al 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
Esto básicamente agrupa sus datos por Category,Name
, pedidos por otra cosa (no estoy seguro si COUNT(Name)
es realmente lo que desea aquí), y luego lo divide en 20 partes, cada una de las cuales representa el 5% de su partición de datos. El segmento con NTile = 1
es el 5 % superior; simplemente ignóralo cuando selecciones del CTE.
Ver:
- Documentos de MSDN en NTILE
- Funciones de clasificación de SQL Server 2005
- SQL SERVER – 2005 – Ejemplo de ejemplo de funciones de RANKING – ROW_NUMBER, RANK, DENSE_RANK, NTILE
para más información