Benutzer-definierte ranking - / Video-Analyse-Funktionen in SQL Server 2008
Ich bin der Planung einer data warehouse-migration zu SQL Server 2008, und versuchen zu denken, von Möglichkeiten, um zu replizieren, LAG, LEAD, FIRST_VALUE und LAST_VALUE analytische Funktionen von Oracle, in SQL Server 2008. Sie sind nicht in SQL Server 2008, obwohl die grundlegenden Mechanismen für Fenster-analytische Funktionen (z.B. ROW_NUMBER, RANK und DENSE_RANK sind alle vorhanden).
Für diese Funktionen ist es möglich, zur Erzielung der gleichen Funktion durch erstellen einer Unterabfrage, weist jede Zeile eine Zahl mit ROW_NUMBER und dann tut self-joins, die Abfrage von verknüpften Zeilen mit in der Nähe Zeilennummern (für die LAG und LEAD), oder eine Zeile Zahl 1 (für FIRST_VALUE).
Ich erwarte, dass zu tun, die self-joins beeinträchtigt die Effizienz eines Vorgangs: aber ich weiß noch nicht über einen SQL-Server zu testen. So, ohne die eigentlich beurteilt die Leistung, Frage ich mich, ob es eine bessere Lösung, die vermeidet, dass die self-joins.
Blick auf die Dokumentation für benutzerdefinierte Aggregatfunktionen, ist es denkbar, dass die gleichen code-Struktur verwendet werden könnte, um die Bereitstellung von Benutzer-definierten analytischen Funktionen.
Also meine Frage ist: können Sie fügen Sie ein OVER () - Klausel, nach der eine benutzerdefinierte Aggregatfunktion haben es genannt, wie eine analytische Funktion?
Wenn dem so ist, ist die Terminate () - Methode aufgerufen, einmal pro Zeile? Gibt es etwas besonderes benötigt, um sicherzustellen, dass Zeilen, die gesendet werden, um Ihre UDF-Datei in die Bestellung angegeben in der OVER () - Klausel?
InformationsquelleAutor William Rose | 2009-11-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde verwenden Sie self-joins nicht udfs.
Sind Sie auf der Suche Skalare UDFS, verwenden Sie die Tabelle zugreifen, die fast immer gibt schlechte performance (es ist ein cursor). Andernfalls könnten Sie wahrscheinlich verwenden, ANWENDEN, aber auch dies ist Zeile für Zeile.
Auch, der Oracle ist nicht für alle Funktionen-Aggregat-Funktionen. Ein user defined aggregate wäre noch zu tun, die die gleiche Verarbeitung über das ResultSet.
Erinnern, intern Oracle würde noch einige zeilenweise Verarbeitung, um die Werte sowieso.
So, SQL Server 2005+ Beispiel für FIRST_VALUE (nicht getestet) mit self-join.
Hinweis: der cross join zu entkoppeln FIRST_VALUE und der rest 2, weil das Ergebnis-sets haben keine Beziehung. Wenn Sie eine UDF oder Benutzer definiert agg, dann die meisten wahrscheinlich, dass Sie müssten, um zu berechnen, FIRST_VALUE, über und über pro Zeile aus der 1. ResultSet.
Kann es sein, dass Sie den service mehrerer Ausgänge in einem self-join. In meinem Beispiel könnte man die Esel eine zusätzliche CTE Spalte für Gehalt DESC und tun LAST_VALUE zu. Mehrere udfs schlimmer wäre, dass eine einzige UDF.
InformationsquelleAutor gbn
In der SQL server-Analyse ist Teil von SSAS; Sie finden FirstNonEmpty, LastNonEmpty, FirstChild, LastChild gibt. Es ist im Lieferumfang von standard-und enterprise-Versionen von SQL server; siehe hier. Das heißt, wenn Sie bauen möchten cubes.
InformationsquelleAutor Damir Sudarevic