Joh*_*tom 9 t-sql sql-server group-by
我想使用该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
Run Code Online (Sandbox Code Playgroud)
这可以实现吗?我知道我可以使用OVER子句对percentile_cont结果进行分组......
但后来我被困在使用两个查询,不是吗?
Joh*_*tom 10
只是弄明白了......必须删除组,并给两个聚合函数一个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
Run Code Online (Sandbox Code Playgroud)
        您不能对窗口函数使用“分组依据”。这些函数返回每一行的聚合值。一种方法是使用“select distinct”来去除重复的行。只需确保按非聚合列(在本例中为 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;
Run Code Online (Sandbox Code Playgroud)