Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie wähle ich die TOP 5 PROZENT aus jeder Gruppe aus?

Sie könnten einen CTE (Common Table Expression) zusammen mit dem NTILE verwenden Windowing-Funktion - diese zerlegt Ihre Daten in so viele Slices wie Sie brauchen, z.B. in Ihrem Fall in 20 Scheiben (je 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

Dies gruppiert Ihre Daten grundsätzlich nach Category,Name , Bestellungen von etwas anderem (nicht sicher, ob COUNT(Name) ist wirklich das, was Sie hier wollen) und zerlegt es dann in 20 Teile, die jeweils 5 % Ihrer Datenpartition darstellen. Das Slice mit NTile = 1 ist der oberste 5 %-Slice - ignorieren Sie das einfach bei der Auswahl aus dem CTE.

Siehe:

für weitere Informationen