sql server 2012 自定义聚合函数(MAX_O3_8HOUR_ND) 计算最大的臭氧8小时滑动平均值

采用c#开发dll,并添加到sql server 中。

具体代码,可以用visual studio的向导生成模板。

using System;
using System.Collections;
using System.Data;
using Microsoft.SqlServer.Server;
using System.Data.SqlTypes;
using System.IO;
using System.Text;

[Serializable]
[Microsoft.SqlServer.Server.SqlUserDefinedAggregate(
    Format.UserDefined, //use clr serialization to serialize the intermediate result
    IsInvariantToNulls = true, //optimizer property
    IsInvariantToDuplicates = false, //optimizer property
    IsInvariantToOrder = false, //optimizer property
    MaxByteSize = 8000) //maximum size in bytes of persisted value
]
public class MAX_O3_8HOUR_ND : IBinarySerialize
{
    /// <summary>
    /// The variable that holds the intermediate result of the concatenation
    /// </summary>
    private StringBuilder intermediateResult;

    /// <summary>
    /// 系统初始化
    /// </summary>
    public void Init()
    {
        this.intermediateResult = new StringBuilder();
    }

    /// <summary>
    /// 积累文本内容,null除外,一般用标点符号隔开。
    /// </summary>
    /// <param name="value"></param>
    public void Accumulate(SqlString value)
    {
        if (value.IsNull)
        {
            return;
        }

        this.intermediateResult.Append(value.Value).Append(‘,‘);
    }

    /// <summary>
    /// Merge the partially computed aggregate with this aggregate.
    /// </summary>
    /// <param name="Group"></param>
    public void Merge(MAX_O3_8HOUR_ND Group)
    {
        this.intermediateResult.Append(Group.intermediateResult);
    }

    /// <summary>
    ///在最后被调用,返回聚合函数结果
    /// </summary>
    /// <returns></returns>
    public SqlString Terminate()
    {
        string output = string.Empty;
        ArrayList list = new ArrayList();
        if (this.intermediateResult != null&& this.intermediateResult.Length > 0)
        {
            output = this.intermediateResult.ToString(0, this.intermediateResult.Length - 1);
            string [] result=output.Split(‘,‘);
            float max = 0;
            if (result.Length >= 8)
            {
                for (int i = 0; i <= result.Length - 8; i++)
                {
                    float re = 0;
                    for (int j = i; j < 8 + i; j++)
                    {
                        re = re + Convert.ToSingle(result[j]);
                    }
                    re=re/8;
                    if (re > max)
                    {
                        max = re;
                    }
                }
                output = Math.Ceiling(max).ToString();
            }
            else
            {
                output=string.Empty;
            }

        }

        return new SqlString(output);
    }

    public void Read(BinaryReader r)
    {
        intermediateResult = new StringBuilder(r.ReadString());
    }

    public void Write(BinaryWriter w)
    {
        w.Write(this.intermediateResult.ToString());
    }
}

dll添加到sql server,创建聚合函数。

CREATE ASSEMBLY [MAX_O3_8HOUR_ND] AUTHORIZATION [dbo]
FROM ‘c:\MAX_O3_8HOUR_ND.dll‘
WITH PERMISSION_SET = SAFE;

CREATE AGGREGATE [dbo].[MAX_O3_8HOUR_ND] (@FieldValue [nvarchar](4000))
RETURNS [nvarchar](4000)
EXTERNAL NAME [MAX_O3_8HOUR_ND].[MAX_O3_8HOUR_ND];

sql server 开启 CLR支持:

EXEC sp_configure ‘clr enabled‘, 1
RECONFIGURE WITH OVERRIDE
GO

示例:

SELECT FDATE,SITENAME, dbo.MAX_O3_8HOUR_ND(O3) FROM MONITOR_ND
GROUP BY FDATE,SITENAME
ORDER BY FDATE,SITENAME

时间: 2024-10-20 04:03:25

sql server 2012 自定义聚合函数(MAX_O3_8HOUR_ND) 计算最大的臭氧8小时滑动平均值的相关文章

SQL Server的各种聚合函数

聚合函数是对一组值执行计算并返回单一的值的函数,它经常与SELECT语句的GROUP BY子句一同使用,SQL SERVER 中具体有哪些聚合函数呢?我们来一一看一下: 1. AVG 返回指定组中的平均值,空值被忽略. 例:select prd_no,avg(qty) from sales group by prd_no 2. COUNT 返回指定组中项目的数量. 例:select count(prd_no) from sales 3. MAX 返回指定数据的最大值. 例:select prd_

Sql Server系列:聚合函数

1. SUM SUM是一个求和函数,返回指定列值的总和.SUM 只能用于数字列. 其中忽略 Null 值. 语法: SUM ( [ ALL | DISTINCT ] expression ) OVER ( [ partition_by_clause ] order_by_clause ) 示例: SELECT SUM([UnitsInStock]) FROM [dbo].[Product] SELECT SUM(DISTINCT([UnitsInStock])) FROM [dbo].[Prod

SQL Server 自定义聚合函数

说明:本文依据网络转载整理而成,因为时间关系,其中原理暂时并未深入研究,只是整理备份留个记录而已. 目标:在SQL Server中自定义聚合函数,在Group BY语句中 ,不是单纯的SUM和MAX等运算,可以加入拼接字符串. 环境: 1:Sqlserver 2008 R2 2:Visual Studio 2013 第一部分: .net代码: using System; using System.Data; using Microsoft.SqlServer.Server; using Syst

SQL Server -&gt;&gt; FIRST_VALUE和LAST_VALUE函数

两个都是SQL SERVER 2012引入的函数.用于返回在以分组和排序后取得最后一行的某个字段的值.很简单两个函数.ORDER BY字句是必须的,PARITION BY则是可选. 似乎没什么好说的.结果在测试LAST_VALUE函数的时候有个问题. 下面是测试脚本 ;with t as (SELECT TOP 100 ROW_NUMBER() OVER(ORDER BY column_id) as num FROM sys.columns) select num, num/10 as grp_

【Transact-SQL】SQL Server 2012新功能之一:转换函数

在SQL Server 2012中,新增了几个转换函数,用于支持数据类型的强制转化. 由于之前主要用的是SQL Server 2008R2,而公司的项目为了提高开发效率,很多表的列都为varchar类型,但也会存储数字. 当对这些列进行聚合计算,比如sum时,要先进行cast转换为numeric类型,经常会报错,现在有了这些新的函数,可以先try一下,通过判断返回值是否为null,我们可以判断字段值是否为数字,如果不是数字,就直接过滤到,所以这些函数非常实用,希望对大家有用. 1.PARSE函数

SQL Server 2012 新的分页函数 OFFSET &amp; FETCH NEXT

DECLARE @page INT, @size INT;select @page = 300, @size = 10 SELECT *FROM gpcomp1.GPCUSTWHERE company like 'a%'ORDER BY CUSTNOOFFSET (@page -1) * @size ROWSFETCH NEXT @size ROWS ONLY; SQL Server 2012 新的分页函数 OFFSET & FETCH NEXT,布布扣,bubuko.com

SQL Server 2012 案例教程(贾祥素)——学习笔记

第2章 SQL Server 2012概述 1.SQL(Structed Query Language),结构化查询语言. 2.SSMS(SQL Server Mangement Studio),SQL Server 2012的操作环境. 3.连接SQL Server之前应先启动SQL Server服务,即SQL Server(MSSQLSERVER): 方法1 开始--所有程序--Microsoft SQL Server 2012--配置工具--SQL Server配置管理器. 方法2 控制面

SQL Server 2012 各版本功能比较

转载来自 <一棵树-博客园>  地址:http://www.cnblogs.com/atree/p/SQL_Server_2012_Enterprise_Standard.html SQL Server 2012 各版本功能比较 有关不同版本的 SQL Server 2012 所支持的功能的详细信息. 功能名称 Enterprise 商业智能 Standard Web Express with Advanced Services Express with Tools Express 单个实例使

Querying Microsoft SQL Server 2012 读书笔记:查询和管理XML数据 2 -使用XQuery 查询XML数据

原文:Querying Microsoft SQL Server 2012 读书笔记:查询和管理XML数据 2 -使用XQuery 查询XML数据 XQuery 是一个浏览/返回XML实例的标准语言. 它比老的只能简单处理节点的XPath表达式更丰富. 你可以同XPath一样使用.或是遍历所有节点,塑造XML实例的返回等. 作为一个查询语言, 你需要一个查询处理引擎. SQL Server 数据库通过XML数据类型方法的T-SQL 语句来处理XQuery. SQL Server 并不支持所有的X