我正在计划将数据仓库迁移到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)的相关行来实现相同的功能。
我预计进行自连接会降低操作的效率:但是我还没有SQL Server进行测试。因此,在实际评估性能之前,我想知道是否有更好的解决方法可以避免自连接。
查看用户定义的聚合函数文档后,可以想象可以使用相同的代码结构来提供用户定义的分析函数。
所以我的问题是:您是否可以在用户定义的聚合函数之后添加OVER()子句,以使其作为分析函数调用?
如果可以,每行是否会调用一次Terminate()方法?是否需要特殊处理以确保按照OVER()子句中指定的顺序将行发送到您的UDF中?
对于这些函数,可以通过创建一个子查询并使用ROW_NUMBER为每行分配一个数字,然后自连接该查询以查找具有相邻行号(对于LAG和LEAD)或行号为1(对于FIRST_VALUE)的相关行来实现相同的功能。
我预计进行自连接会降低操作的效率:但是我还没有SQL Server进行测试。因此,在实际评估性能之前,我想知道是否有更好的解决方法可以避免自连接。
查看用户定义的聚合函数文档后,可以想象可以使用相同的代码结构来提供用户定义的分析函数。
所以我的问题是:您是否可以在用户定义的聚合函数之后添加OVER()子句,以使其作为分析函数调用?
如果可以,每行是否会调用一次Terminate()方法?是否需要特殊处理以确保按照OVER()子句中指定的顺序将行发送到您的UDF中?