Je voudrais utiliser la fonction percentile_cont
pour get des valeurs médianes dans T-SQL. Cependant, j'ai aussi besoin de valeurs moyennes. J'aimerais faire quelque chose comme:
SELECT CustomerID , AVG(Expenditure) AS MeanSpend , percentile_cont ( .5) WITHIN GROUP(ORDER BY Expenditure) OVER( ) AS MedianSpend FROM Customers GROUP BY CustomerID
Cela peut-il être accompli? Je sais que je peux utiliser la clause OVER pour regrouper les résultats de percentile_cont
…
mais alors je suis coincé en utilisant deux requêtes, n'est-ce pas?
Je l'ai juste compris … Je dois laisser tomber le groupe et donner aux deux fonctions d'agrégation une instruction over.
SELECT CustomerID, AVG(Expenditure) OVER(PARTITION BY CustomerID) AS MeanSpend, percentile_cont(.5) WITHIN GROUP(ORDER BY Expenditure) OVER(PARTITION BY CustomerID) AS MedianSpend FROM Customers
Vous ne pouvez pas utiliser "group by" avec les fonctions de la window. Ces fonctions renvoient les valeurs agrégées pour chaque ligne. Une façon consiste à utiliser "select distinct" pour se débarrasser des lignes en double. Assurez-vous simplement de partitionner chaque fonction de la window par les colonnes non agrégées (groupId dans cet exemple).
--Generate test data SELECT TOP(10) value.number%3 AS groupId , value.number AS number INTO #data FROM master.dbo.spt_values AS value WHERE value."type" = 'P' ORDER BY NEWID() ; --View test data SELECT * FROM #data ORDER BY groupId,number; --CALCULATE MEDIAN SELECT DISTINCT groupId , AVG(number) OVER(PARTITION BY groupId) AS mean , percentile_cont(.5) WITHIN GROUP(ORDER BY number) OVER(PARTITION BY groupId) AS median FROM #data ; --Clean up DROP TABLE #data;