sql >> Databasteknik >  >> RDS >> Sqlserver

Hur väljer jag TOP 5 PROCENT från varje grupp?

Du kan använda ett CTE (Common Table Expression) parat med NTILE fönsterfunktion - detta kommer att dela upp din data i så många skivor som du behöver, t.ex. i ditt fall, i 20 skivor (vardera 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

Detta grupperar i princip dina data efter Category,Name , beställer av något annat (osäker på om COUNT(Name) är verkligen det du vill ha här), och delar sedan upp det i 20 bitar, som var och en representerar 5 % av din datapartition. Snittet med NTile = 1 är den översta 5%-delen - ignorera bara det när du väljer från CTE.

Se:

för mer information



  1. Extrahera och medelvärdesberäkning av momentana värden i temporal DB i postgresql

  2. Är det möjligt att inaktivera borttagningar på en tabell på MYSQL?

  3. Geolokaliseringsavstånd SQL från en stadstabell

  4. Gå med i flera tabeller för att få NOT EQUAL-värden i MySQL