Можно ли использовать определяемые пользователем агрегаты (clr) с оконными функциями (сверху)?
Не могу найти ответ в документации: http://technet.microsoft.com/en-us/library/ms190678.aspx
Можно ли использовать определяемые пользователем агрегаты (clr) с оконными функциями (сверху)?
Не могу найти ответ в документации: http://technet.microsoft.com/en-us/library/ms190678.aspx
Вы правы, сложно найти что-либо в документации. Но при поиске на веб-сайте Connect мне удалось найти этот драгоценный камень< /а>:
Сегодня вы можете использовать агрегаты CLR с предложением OVER и PARTITION BY точно так же, как обычные агрегатные функции. Как только у нас появится поддержка оконных функций...
Это был ответ от Microsoft.
Тем не менее, поиск на сайте 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());
}
}
А затем запустите этот скрипт:
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
Это далеко не так - вы могли бы легко найти ответ для себя, просто попробовав его.
ORDER BY
, ни ROWS
, ни RANK
не поддерживаются в предложении OVER
. Это просто дает синтаксическую ошибку.
- person Jens; 10.04.2015
PARTITION BY
. И если вы рассмотрите, как определяются агрегаты CLR (особенно Merge
), вы поймете, что в их текущей форме они не могут поддерживать эти другие части (мы теряем информацию о порядке).
- person Damien_The_Unbeliever; 10.04.2015