Я планирую миграцию хранилища данных на SQL Server 2008 и пытаюсь найти способы репликации аналитических функций LAG, LEAD, FIRST_VALUE и LAST_VALUE из Oracle в SQL Server 2008. Они не включены в SQL Server 2008, хотя основной механизм для оконных аналитических функций есть (например, ROW_NUMBER, RANK и DENSE_RANK все присутствуют).
Для этих функций можно достичь той же функции, создав подзапрос, который присваивает каждой строке номер с помощью ROW_NUMBER, а затем выполняя самопсоединения этого запроса, чтобы найти связанные строки с соседними номерами строк (для LAG и LEAD). или номер строки 1 (для FIRST_VALUE).
Я ожидаю, что выполнение самостоятельных объединений умалит эффективность операции: но у меня пока нет SQL Server для проверки этого. Поэтому, не оценивая производительность на самом деле, мне интересно, есть ли лучший обходной путь, позволяющий избежать самообъединений.
Глядя на документацию для пользовательских агрегатных функций , можно предположить, что та же самая структура кода могла бы использоваться для обеспечения пользовательских аналитических функций.
Итак, мой вопрос: можете ли вы добавить предложение OVER () после определенной пользователем агрегатной функции, чтобы оно вызывалось как аналитическая функция?
Если это так, вызывается ли метод Terminate () один раз в строке? Есть ли что-то особенное, что нужно для того, чтобы строки отправлялись в ваш UDF в порядке, указанном в предложении OVER ()?