我正在计划将数据仓库迁移到 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?