我计算中位数为:
DECLARE @TEMP TABLE
(
ID INT
)
Select
(
(
Select Top 1 ID
From
(
Select Top 50 Percent ID
From @Temp
Where ID Is NOT NULL
Order By ID
) As A
Order By ID DESC
) +
(
Select Top 1 ID
From
(
Select Top 50 Percent ID
From @Temp
Where ID Is NOT NULL
Order By ID DESC
) As A
Order By ID Asc
)
) / 2
以上查询我想使用。columns
但是,就我而言,我想计算的人太多了MEDIAN
。但我认为重复上面的代码块会很糟糕column
。所以,我试图定义单独的函数来接受column
值、处理和返回中值。我应该为此定义table-value-funtion
还是有另一种optimized
方法?
这个问题与以下问题有关:
计算简单或分组中位数的方法比您的问题中显示的方法更有效:
计算中位数最快的方法是什么?
分组中位数的最佳方法
2012 年的总冠军是 Peter Larsson 的方法。模式是:
简单中位数
分组中位数
为了最大化上述
OFFSET
方法的性能,您可能需要添加锁定提示(高级主题)。当然,也需要适当的索引。代码重用
这很难通过 T-SQL 函数直接实现,因为这些函数不允许执行动态 SQL(假设您正在考虑传入列名)。
有几种方法可以解决这个问题,包括使用函数来生成动态 SQL 文本本身,然后可以由调用者执行。问题中没有足够的细节来说明哪种方法最适合您。
如果你想计算一个中值,有几种方法可以做到这一点,具体取决于你(或其他人)使用的 SQL Server 版本。Dwain Camps 为 Simple Talk 写了两篇文章,其中他从不同的人那里收集了几个纯 T-SQL 选项,给出了每个选项的示例并比较了它们的性能:
使用 T-SQL 计算分区集中的中值
T-SQL 窗口函数的性能
但是,我认为您不能将这些方法中的任何一个封装到一个函数中以便于重用。为此,您需要使用 SQLCLR 来创建用户定义的聚合(UDA)。几年前我写了一篇文章,展示了如何创建 UDA,以 Median 为例 :-)
充分利用 SQL Server 2005 UDT 和 UDA
关于那篇文章,请记住:
GZipStream
但是,删除这些东西并MaxByteSize
从更改为 应该相当8000
容易-1
。也可以看看: