Défini par l'utilisateur classement / fonctions analytiques dans SQL Server 2008

Je suis la planification d'un entrepôt de données de la migration vers SQL Server 2008, et essayer de penser à des moyens de reproduire le GAL, de PLOMB, de PREMIÈRE_VALEUR et LAST_VALUE des fonctions analytiques à partir d'Oracle dans SQL Server 2008. Ils ne sont pas inclus dans SQL Server 2008, bien que le mécanisme de base pour la fenêtre des fonctions analytiques est (par exemple, la fonction ROW_NUMBER, GRADE, DENSE_RANK sont tous présents).

Pour ces fonctions, il est possible de réaliser la même fonction par la création d'une sous-requête qui attribue chaque ligne correspond à un nombre à l'aide de la fonction ROW_NUMBER et ensuite de faire de l'auto-jointures de cette requête pour trouver les lignes associées avec les numéros de ligne (LAG et le PLOMB), ou un numéro de ligne de 1 (pour PREMIÈRE_VALEUR).

J'espère que de faire de l'auto-jointures aurait pour effet de diminuer l'efficacité d'une opération: mais je n'ai pas encore de SQL Server pour tester cela. Donc, sans avoir évalué la performance, je me demande s'il existe une meilleure solution qui permet d'éviter l'auto-jointures.

Regarder la documentation pour défini par l'utilisateur fonctions d'agrégation, il est concevable que la même structure de code pourrait être utilisé pour fournir à l'utilisateur défini par des fonctions analytiques.

Donc ma question est: pouvez-vous ajouter un PLUS() de la clause après un définis par l'utilisateur fonction d'agrégation de l'avoir appelée comme une fonction analytique?

Si c'est la Fin() méthode appelée une fois par ligne? Est-il rien de spécial nécessaire pour s'assurer que les lignes sont envoyés à votre UDF dans l'ordre spécifié dans le COURS de() de la clause?

OriginalL'auteur William Rose | 2009-11-16