自定义聚合函数求中位数

liangCK 2009-08-09 07:55:45
加精
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;

}


sql server management studio

CREATE ASSEMBLY ass_test
FROM 'G:\CLR_Test\SqlServerProject5\SqlServerProject5\bin\Debug\SqlServerProject5.dll';
GO

CREATE AGGREGATE MiddleNumber(@number float)
RETURNS float
EXTERNAL NAME ass_test.MiddleNumber;
GO


declare @t table(id int,val float)
insert @t select 1,20.2
union all select 1,50
union all select 1,20

union all select 2,50
union all select 2,20

union all select 3,null

union 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 行受影响)
*/
...全文
1368 61 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
61 条回复
切换为时间正序
请发表友善的回复…
发表回复
betaiii 2012-04-21
  • 打赏
  • 举报
回复
牛终于知道了。
lfywy 2010-05-25
  • 打赏
  • 举报
回复
bucuode fangfa~~~~~~~~~~~~~~~~
mingyicz 2009-08-17
  • 打赏
  • 举报
回复
牛。。。。。。。。
hhh871030 2009-08-12
  • 打赏
  • 举报
回复
好牛叉。。学习了
SlaughtChen 2009-08-12
  • 打赏
  • 举报
回复
学习
xuejie09242 2009-08-12
  • 打赏
  • 举报
回复
2000呢,可以利用扩展存储过程,是吗?呵呵
没有做过相关的内容,感觉既然是数据库不擅长的,就交给计算机语言去做,没必要在数据库中实现。
playwarcraft 2009-08-11
  • 打赏
  • 举报
回复
lily_2006 2009-08-11
  • 打赏
  • 举报
回复
MARK一下以后学习
xszzhong 2009-08-11
  • 打赏
  • 举报
回复
展示下
yuxinken 2009-08-11
  • 打赏
  • 举报
回复
学习
zhouchuang301 2009-08-11
  • 打赏
  • 举报
回复
999999999999999999
huntzw 2009-08-10
  • 打赏
  • 举报
回复
学习拉!
西瓜小刀 2009-08-10
  • 打赏
  • 举报
回复
哇!
学习学习……
ai_li7758521 2009-08-10
  • 打赏
  • 举报
回复
学习
alisafan123 2009-08-10
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 lllsui 的回复:]
向lz学习
[/Quote].
lllsui 2009-08-10
  • 打赏
  • 举报
回复
向lz学习
mybuhui 2009-08-10
  • 打赏
  • 举报
回复
ding
liangCK 2009-08-10
  • 打赏
  • 举报
回复
海爷.指点一下.
昵称被占用了 2009-08-10
  • 打赏
  • 举报
回复
.
fuxiaoyang13 2009-08-10
  • 打赏
  • 举报
回复
xuexi
加载更多回复(41)

27,582

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧