Dam*_*ver 6

你是对的,在文档中找到任何东西都很棘手.但是在Connect网站上搜索,我找到了这个宝石:

今天,您可以像使用常规聚合函数一样使用带有OVER子句和PARTITION BY的CLR聚合.一旦我们支持窗口功能......

这是微软的回应.


但是,在我等待老化机器创建新数据库项目并创建此聚合时,在Connect站点上搜索是我所做的:

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.IO;
using Microsoft.SqlServer.Server;

[Serializable]
[Microsoft.SqlServer.Server.SqlUserDefinedAggregate(Format.UserDefined,MaxByteSize = 2000)]
public struct SqlAggregate1 : IBinarySerialize
{
    private SqlString last;
    public void Init()
    {
        // Ignore
    }

    public void Accumulate(SqlString Value)
    {
        last = Value;
    }

    public void Merge (SqlAggregate1 Group)
    {
        // Ignore
    }

    public SqlString Terminate ()
    {
        // Put your code here
        return last;
    }

    public void Read(BinaryReader r)
    {
        last = new SqlString(r.ReadString());
    }

    public void Write(BinaryWriter w)
    {
        w.Write(last.ToString());
    }
}
Run Code Online (Sandbox Code Playgroud)

然后运行此脚本:

select dbo.SqlAggregate1(Column2) OVER (PARTITION BY Column1)
from (select 1,'abc' union all select 1,'def' union all
      select 2,'ghi' union all select 2,'jkl') as t(Column1,Column2)
Run Code Online (Sandbox Code Playgroud)

哪个产生:

------------
abc
abc
ghi
ghi
Run Code Online (Sandbox Code Playgroud)

这还有很长的路要走 - 你可以通过尝试轻松地找到自己的答案.

  • 但是`OVER`子句似乎不支持`ORDER BY`,`ROWS`和`RANK`。这只是语法错误。 (2认同)