2014-03-12 39 views

回答

5

你说得对,这是比较难找到的文档中任何事情。但搜索网站的连接,我设法找到这个gem

今天,你可以使用CLR积累了与OVER子句和PARTITION BY就像普通的聚合函数。一旦我们支持窗口功能...

这是微软的回应。


然而,在搜索上的连接部位为我做了什么,而我在等我的年龄机创建一个新的数据库项目和创建此聚集:

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()); 
    } 
} 

然后运行该脚本:

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) 

主要生产:

------------ 
abc 
abc 
ghi 
ghi 

这是一个很长的路要说 - 你可以很容易地发现自己的答案只需尝试它。

+1

但是'ORDER BY','ROWS'和'RANK'似乎都不被'OVER'子句支持。这只是给出了一个语法错误。 – Jens

+0

@Jens - MS连接项目承诺的所有内容都是“PARTITION BY”。如果您考虑如何定义CLR聚合(特别是'合并'),您将意识到,在他们当前的形式下,他们无法支持其他部分(我们失去了订购信息) –

+0

我鼓励人们对[连接问题](https://connect.microsoft.com/SQLServer/feedback/details/586867/user-defined-ranking-functions),所以微软更有可能在某一天实际执行此操作。 – MgSam

相关问题