2013-10-23 19 views
5

我想使用percentile_cont函数来获取T-SQL中的中值。不过,我也需要得到平均值。我想要做的事情如下:在T-SQL中使用percentile_cont和“group by”语句

SELECT CustomerID , 
    AVG(Expenditure) AS MeanSpend , percentile_cont 
    (.5) WITHIN GROUP(ORDER BY Expenditure) OVER() AS MedianSpend 
FROM Customers 
GROUP BY CustomerID 

这可以实现吗?我知道我可以使用OVER子句将percentile_cont结果分组...

但后来我被卡住使用两个查询,我不是吗?

+0

你试过了吗?我认为这确实有用。 – RBarryYoung

+0

我试过了。这是错误... 列'Expenditure'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。 –

回答

4

刚刚计算出来...得放弃小组,并给两个聚合函数一个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 
+1

如果您的组中有多行,它将返回重复项。如果你每组只有一行,那么你不需要任何这些功能。 – jumxozizi

0

您不能对窗口函数使用“group by”。这些函数返回每一行的聚合值。一种方法是使用“选择不同”来摆脱重复的行。只要确保你使用非聚合列(本例中为groupId)对每个窗口函数进行分区。

--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;