自定义聚合函数求中位数
vs.net->新建项目->C#->数据库项目->新建一个聚合函数
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;}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
[解决办法]
小P梁真小气,才20?建议加到400
[解决办法]
学习
[解决办法]
学习
[解决办法]
顶!
[解决办法]