Anda benar bahwa sulit untuk menemukan apa pun dalam dokumentasi. Tetapi mencari di situs web Connect, saya berhasil menemukan permata ini:
Hari ini, Anda dapat menggunakan agregat CLR dengan klausa OVER dan PARTITION BY seperti fungsi agregat biasa. Setelah kami mendapat dukungan untuk fungsi jendela...
Yang merupakan tanggapan dari Microsoft.
Namun, pencarian di situs Connect adalah apa yang saya lakukan ketika saya menunggu mesin lama saya untuk membuat proyek database baru dan membuat agregat ini:
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());
}
}
Dan kemudian jalankan skrip ini:
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)
Yang menghasilkan:
------------
abc
abc
ghi
ghi
Jauh sekali untuk mengatakannya - Anda dapat dengan mudah menemukan jawabannya sendiri hanya dengan mencoba itu.