函数计算SQLServer中的中位数

函数计算SQLServer中的中位数

根据MSDN,中位数在Transact-SQL中不能作为聚合函数使用。但是,我想知道是否可以创建此功能(使用创建聚合函数、用户定义函数或其他方法)。

最好的方法(如果可能的话)是什么?允许在聚合查询中计算中值(假设是数字数据类型)?


智慧大石
浏览 2132回答 3
3回答

繁花不似锦

有很多方法可以做到这一点,而且性能有很大的变化。这里有一个特别优化的解决方案,来自中介、行号和性能..当涉及到在执行过程中生成的实际I/O时,这是一个特别优化的解决方案-它看起来比其他解决方案花费更高,但它实际上要快得多。该页面还包含其他解决方案和性能测试细节的讨论。注意,在中间列的值相同的多行情况下,使用唯一列作为消歧器。与所有数据库性能场景一样,始终尝试使用真实硬件上的真实数据测试解决方案-您永远不知道对SQLServer优化器的更改或您环境中的特性何时会使一个通常快速的解决方案变得更慢。SELECT    CustomerId,    AVG(TotalDue)FROM(    SELECT       CustomerId,       TotalDue,       -- SalesOrderId in the ORDER BY is a disambiguator to break ties       ROW_NUMBER() OVER (          PARTITION BY CustomerId         ORDER BY TotalDue ASC, SalesOrderId ASC) AS RowAsc,       ROW_NUMBER() OVER (          PARTITION BY CustomerId         ORDER BY TotalDue DESC, SalesOrderId DESC) AS RowDesc   FROM Sales.SalesOrderHeader SOH) xWHERE    RowAsc IN (RowDesc, RowDesc - 1, RowDesc + 1)GROUP BY CustomerIdORDER BY CustomerId;

子衿沉夜

如果您使用的是SQL 2005或更高版本,那么对于表中的单个列来说,这是一个很好的、简单的中值计算:SELECT(  (SELECT MAX(Score) FROM    (SELECT TOP 50 PERCENT Score FROM Posts ORDER BY Score) AS BottomHalf)  +  (SELECT MIN(Score) FROM    (SELECT TOP 50 PERCENT Score FROM Posts ORDER BY Score DESC) AS TopHalf)) / 2 AS Median
打开App,查看更多内容
随时随地看视频慕课网APP