自定义聚合函数求中位数

using System;

System.Data;

System.Data.sqlClient;

System.Data.sqlTypes;

Microsoft.sqlServer.Server;

System.IO;

System.Collections.Generic;

[Serializable]

[sqlUserDefinedAggregate(Format.UserDefined,

MaxByteSize = 8000,sans-serif; font-size: 9pt; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-no-proof: yes;" lang="EN-US"> IsNullIfEmpty = true,sans-serif; font-size: 9pt; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-no-proof: yes;" lang="EN-US"> 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);

return sqlDouble.Null;

public void Write(BinaryWriter writer)

int lCount = list.Count;

writer.Write(lCount);

foreach (double number in list)

writer.Write(number);

public void Read(BinaryReader reader)

int lCount = reader.ReadInt32();

for (int i = 0; i < lCount; i++)

list.Add(reader.ReadDouble());

// 这是占位符成员字段

private List<double> list;

}

--sql SERVER

CREATE ASSEMBLY ass_test

FROM 'G:/CLR_Test/sqlServerProject5/sqlServerProject5/bin/Debug/sqlServerProject5.dll';

GO

AGGREGATE MiddleNumber(@number float)

RETURNS float

EXTERNAL NAME ass_test.MiddleNumber;

declare @t table(id int,val float)

insert @t select 1,20.2

union all select 1,50

all select 2,sans-serif; font-size: 9pt; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-no-proof: yes;" lang="EN-US"> all select 3,null

all select 4,0

--查询

select id,dbo.MiddleNumber(val) as 中位数

from @t

group by id

/*

id 中位数

----------- ----------------------

1 20.2

2 35

3 NULL

4 0

(4 行受影响)

*/

相关文章

迭代器模式(Iterator)迭代器模式(Iterator)[Cursor]意图...
高性能IO模型浅析服务器端编程经常需要构造高性能的IO模型,...
策略模式(Strategy)策略模式(Strategy)[Policy]意图:定...
访问者模式(Visitor)访问者模式(Visitor)意图:表示一个...
命令模式(Command)命令模式(Command)[Action/Transactio...
生成器模式(Builder)生成器模式(Builder)意图:将一个对...