是否可以创建通用SP来确定中位数?

时间:2016-06-10 15:04:16

标签: sql-server median

我正在使用SQL Server 2012.我想我要问的是我应该继续研究创建SP(或UDF的能力,但可能涉及#Temp表,我正在考虑SP)的顺序有一个可重用的对象来确定中位数?

我希望这不是一个问题的过于通用,而是被冲洗,但我花了一些时间研究确定中值的能力。一些可能的障碍包括需要传递查询的字符串表示,该表示将返回我希望执行中值的数据。

过去有人试过这个吗?

4 个答案:

答案 0 :(得分:1)

这是我用来生成一些快速统计数据的存储过程。

只需传递来源,测量和/或过滤。

CREATE PROCEDURE [dbo].[prc-Dynamic-Stats](@Table varchar(150),@Fld varchar(50), @Filter varchar(500)) 

-- Syntax: Exec [dbo].[prc-Dynamic-Stats] '[Chinrus-Series].[dbo].[DS_Treasury_Rates]','TR_Y10','Year(TR_Date)>2001' 

As

Begin
    Set NoCount On;

    Declare @SQL varchar(max) = 
    '
    ;with cteBase as (
     Select RowNr=Row_Number() over (Order By ['+@Fld+'])
           ,Measure = ['+@Fld+']
     From '+@Table+'
     Where '+case when @Filter='' then '1=1' else @Filter end+' 
    )
    Select RecordCount   = Count(*)
          ,DistinctCount = Count(Distinct A.Measure)
          ,SumTotal      = Sum(A.Measure)
          ,Minimum       = Min(A.Measure)
          ,Maximum       = Max(A.Measure)
          ,Mean          = Avg(A.Measure)
          ,Median        = Max(B.Measure)
          ,Mode          = Max(C.Measure)
          ,StdDev        = STDEV(A.Measure)
     From cteBase A
     Join (Select Measure From cteBase where RowNr=(Select Cnt=count(*) from cteBase)/2) B on 1=1
     Join (Select Top 1 Measure,Hits=count(*) From cteBase Group By Measure Order by 2 desc ) C on 1=1
    '
    Exec(@SQL)

End

返回

RecordCount DistinctCount   SumTotal    Minimum Maximum Mean    Median  Mode    StdDev
3615        391             12311.81    0.00    5.44    3.4057  3.57    4.38    1.06400795277565

答案 1 :(得分:1)

您可能需要查看我发布的this回复。简而言之,如果您熟悉C#或VB .NET,则可以创建用户定义的CLR聚合。我们将CLR实现用于很多方面,尤其是您可能在其他平台(如SAS,R等)中看到的统计方法。

答案 2 :(得分:1)

通过SQLCLR创建用户定义聚合(UDA)可以轻松实现。如果您想了解如何操作,甚至只是下载UDA,请查看我在SQL Server Central上撰写的有关它的文章:Getting The Most Out of SQL Server 2005 UDTs and UDAs(请注意,该网站需要免费注册才能阅读其内容)。

或者,它也可以在http://SQLsharp.com/的免费版SQL#SQLCLR库中找到(我创建了它,但它是免费的)。它被称为 Agg_Median

答案 3 :(得分:0)

如果使用SQL Server 2008或更新版本(您是),您可以编写一个接受table-valued parameter作为输入的函数。

Create Type MedianData As Table ( DataPoint Int )
Create Function CalculateMedian ( @MedianData MedianData ReadOnly )
Returns Int
As
    Begin
        -- do something with @MedianData which is a table
    End