读书人

自定义聚合函数求中位数,该怎么解决

发布时间: 2012-02-22 19:36:55 作者: rapoo

自定义聚合函数求中位数
vs.net->新建项目->C#->数据库项目->新建一个聚合函数

C# code
using System;using System.Data;using System.Data.SqlClient;using System.Data.SqlTypes;using Microsoft.SqlServer.Server;using System.IO;using System.Collections.Generic;[Serializable][SqlUserDefinedAggregate(Format.UserDefined,                         MaxByteSize=8000,                         IsNullIfEmpty=true,                         Name = "MiddleNumber")]public class MiddleNumber:IBinarySerialize {    public void Init()    {        list = new List<double>();    }    public void Accumulate(SqlDouble Value)    {        if (Value.IsNull == false)            list.Add(Value.Value);    }    public void Merge(MiddleNumber Group)    {        list.AddRange(Group.list);    }    public SqlDouble Terminate()    {        double re = 0;        int lCount = 0;        list.Sort();        lCount = list.Count;        if (lCount > 0)        {            if (lCount % 2 == 0)            {                re = (double)((Convert.ToDouble(list[lCount / 2 - 1]) + Convert.ToDouble(list[lCount / 2])) / 2.0);            }            else            {                re = (double)(Convert.ToDouble(list[Convert.ToInt32(Math.Floor(lCount / 2.0))]));            }            return new SqlDouble(re);        }        else        {            return SqlDouble.Null;        }    }    public void Write(BinaryWriter writer)    {        int lCount = list.Count;        writer.Write(lCount);        if (lCount > 0)        {            foreach (double number in list)            {                writer.Write(number);            }        }    }    public void Read(BinaryReader reader)    {        int lCount = reader.ReadInt32();        list = new List<double>();        for (int i = 0; i < lCount; i++)        {            list.Add(reader.ReadDouble());        }    }    // 这是占位符成员字段    private List<double> list;}


sql server management studio

SQL code
CREATE ASSEMBLY ass_testFROM 'G:\CLR_Test\SqlServerProject5\SqlServerProject5\bin\Debug\SqlServerProject5.dll';GOCREATE AGGREGATE MiddleNumber(@number float)    RETURNS floatEXTERNAL NAME ass_test.MiddleNumber;GOdeclare @t table(id int,val float)insert @t select 1,20.2union all select 1,50union all select 1,20union all select 2,50union all select 2,20union all select 3,nullunion all select 4,0--查询select id,dbo.MiddleNumber(val) as 中位数from @tgroup by id/*id          中位数----------- ----------------------1           20.22           353           NULL4           0(4 行受影响)*/


[解决办法]
学习
[解决办法]
牛X
[解决办法]
用来学习的,顶。。。
[解决办法]
public void Init()
{
list = new List<double>();
}
呜 ..梁哥这个list 泛型变量在哪声明的呀???
[解决办法]
学习
[解决办法]
探讨
引用:
public void Init()
    {
        list = new List <double>();
    }
呜 ..梁哥这个list 泛型变量在哪声明的呀???


这个类的最后面呀.

[解决办法]


没建过数据库项目???
[解决办法]
学习
[解决办法]

X
[解决办法]
小P梁真小气,才20?建议加到400
[解决办法]
学习
[解决办法]
学习
[解决办法]
顶!
[解决办法]

探讨
呜 ..梁哥这个list 泛型变量在哪声明的呀???


这个类的最后面呀.

[解决办法]
对我学习非常有用处,谢谢楼主,继续加油
[解决办法]
太棒了啊,楼主不错
[解决办法]
哇···完全是······
[解决办法]
学习
[解决办法]
学习!!
[解决办法]
学习啦

读书人网 >SQL Server

热点推荐