SQL Server 2008へのデータウェアハウスの移行を計画しており、SQL Server 2008でOracleからLAG、LEAD、FIRST_VALUE、およびLAST_VALUE分析関数を複製する方法を考えています。これらはSQL Server 2008には含まれていませんが、基本的なものです。ウィンドウ化された分析関数の機構は次のとおりです(たとえば、ROW_NUMBER、RANK、およびDENSE_RANKがすべて存在します)。
これらの関数の場合、ROW_NUMBERを使用して各行に番号を割り当てるサブクエリを作成し、そのクエリの自己結合を実行して、近くの行番号(LAGおよびLEADの場合)に関連する行を見つけることで、同じ機能を実現できます。行番号1(FIRST_VALUEの場合)。
自己結合を行うと、操作の効率が低下すると思いますが、これをテストするSQLServerはまだありません。したがって、実際にパフォーマンスを評価していなくても、自己結合を回避するより良い回避策があるかどうか疑問に思っています。
ユーザー定義の集計関数のドキュメントを見ると、同じコード構造を使用してユーザー定義の分析関数を提供できると考えられます。
だから私の質問は:ユーザー定義の集計関数の後にOVER()句を追加して、分析関数として呼び出すことができますか?
その場合、Terminate()メソッドは行ごとに1回呼び出されますか?OVER()句で指定された順序で行がUDFに送信されるようにするために、特別に必要なものはありますか?