sql >> データベース >  >> RDS >> Sqlserver

ユーザー定義の集計(clr)をウィンドウ関数(以上)で使用することは可能ですか?

    ドキュメントで何かを見つけるのは難しいことは間違いありません。しかし、ConnectのWebサイトを検索して、この宝石を見つけることができました:

    現在、通常の集計関数と同じように、OVER句とPARTITIONBYでCLR集計を使用できます。ウィンドウ関数のサポートができたら...

    これは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
    

    これは長い道のりです。試してみるだけで、自分で答えを簡単に見つけることができます。




    1. リレーショナルデータベースとは何ですか?

    2. 50以上の列名を入力せずに同じテーブルの行をコピーする(2つの列を変更する場合)

    3. MySQLでSQLスクリプトを実行する方法は?

    4. PostgreSQL –繰り返し値を排除する方法