我正在使用SQL Server 2012.我想我要问的是我应该继续研究创建SP(或UDF的能力,但可能涉及#Temp表,我正在考虑SP)的顺序有一个可重用的对象来确定中位数?
我希望这不是一个问题的过于通用,而是被冲洗,但我花了一些时间研究确定中值的能力。一些可能的障碍包括需要传递查询的字符串表示,该表示将返回我希望执行中值的数据。
过去有人试过这个吗?
答案 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