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)