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
Vous devez vous connecter pour publier un commentaire.
J'avais utilisation de l'auto-jointures pas udf.
Vous êtes à la recherche à scalaires de l'UDF qui utilisent l'accès à la table qui donne presque toujours de mauvaise performance (c'est un curseur). Sinon, vous pourriez probablement utiliser APPLIQUER, mais c'est aussi rangée par rangée.
Aussi, l'Oracle fonctions ne sont pas des fonctions d'agrégation. Un agrégat défini par l'utilisateur aurait encore à faire le même traitement sur le jeu de résultats.
Rappelez-vous, en interne, Oracle aurait encore faire quelques ligne par ligne de traitement de travailler sur les valeurs de toute façon.
Donc, SQL Server 2005+ exemple pour PREMIÈRE_VALEUR (pas testé) à l'aide de l'auto-jointure.
Note la jointure croisée à découpler la PREMIÈRE_VALEUR et le reste 2 parce que les ensembles de résultats ont aucun rapport. Si vous avez utilisé un fichier UDF ou défini par l'utilisateur apa, il est alors probable que vous auriez à calculer PREMIÈRE_VALEUR plus et plus d'une par ligne à partir du 1er jeu de résultats.
Peut-être que vous pouvez service plusieurs sorties dans une auto-jointure. Dans mon exemple, vous pourriez cul extra CTE colonne de salaire DESC et ne LAST_VALUE trop. Plusieurs udf serait pire qu'une seule UDF.
OriginalL'auteur gbn
Dans SQL server, analytique est la partie de SSAS; vous trouverez FirstNonEmpty, LastNonEmpty, FirstChild, LastChild. Il est inclus avec les versions standard et enterprise de SQL server; voir ici. C'est, si vous voulez construire des cubes.
OriginalL'auteur Damir Sudarevic