13

我想使用该percentile_cont函数在 T-SQL 中获取中值。但是,我也需要获得平均值。我想做类似以下的事情:

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结果进行分组......

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

4

2 回答 2

17

刚刚想通了...必须放弃 group by 并给两个聚合函数一个 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
于 2013-10-23T16:16:09.403 回答
5

您不能将“分组依据”与窗口函数一起使用。这些函数返回每一行的聚合值。一种方法是使用“选择不同的”来删除重复的行。只需确保按非聚合列(本示例中的 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;
于 2016-05-26T15:22:44.377 回答