Ich habe eine kurze TSQL-Anweisung gesehen , die eine Zeichenfolge effektiv in ihre konstituierenden Zeichen aufteilt , eines pro Zeile, um den ascii
Wert für jedes Zeichen zu bewerten .
Wenn ich die Abfrage richtig und effektiv lese, werden 3 CTEs verwendet, um eine Tabelle mit 1 Spalte mit 10.000 Zeilen mit dem Wert '0' zu erstellen.
Ein vierter CTE ist wie folgt definiert:
cteTally(n) AS(
SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) n
FROM E4
)
Anschließend wird dieser CTE mit einer Tabelle verbunden, die eine Spalte mit den interessierenden Zeichenfolgen enthält, mit den folgenden Angaben select
:
SELECT n, SUBSTRING(LastName, n, 1), ASCII( SUBSTRING(LastName, n, 1))
Das heißt, Zeilennummer n, dann das n-te Zeichen in Nachname, dann der ASCII-Wert dieses Zeichens.
Meine Fragen beziehen sich auf die over
Klausel im obigen CTE.
Was genau macht es im Wesentlichen?
Wenn wir row_number aus 10.000 identischen Zeilen abfragen, warum brauchen wir überhaupt eine order by
Klausel? Warum wird das order by
in eine over
Klausel gesetzt und nicht als order by
Klausel für die select
Anweisung - zumal die over
Klausel nicht einmal eine Partition angibt? (Ich nehme an, dies bedeutet, dass das Fenster, über das row_number
operiert wird, die vollen 10.000 Zeilen umfasst?) Und was bedeutet es, nach zu bestellen select null
?
quelle
over
Klausel sayorder by
sind optional - aber ich denke, dies bedeutet, dass Partitionen möglicherweise ohne Fensterfunktionen verwendet werden (und keine benötigenorder by
). Netter Benutzername!ORDER BY
. Nur Ranking Fensterfunktionen -ROW_NUMBER()
,RANK()
,DENSE_RANK()
,NTILE()
. Das Bereitstellen einesPARTITION BY
oder nicht ist irrelevant.SELECT ROW_NUMBER() OVER (ORDER BY 1/0);
Die OVER-Klausel legt die Reihenfolge (und Partitionierung, wenn PARTITION BY enthalten ist) des Zeilensatzes fest, bevor die ausgewählte Fensterfunktion angewendet wird. Da Sie mehrere Fensterfunktionen in einer einzigen Abfrage verwenden können, erfordert jede eine eigene Partitionierung und Reihenfolge, um sicherzustellen, dass die Daten wie gewünscht zurückgegeben werden.
In Ihrem Beispiel wird ROW_NUMBER () verwendet, um eine fortlaufende Zeilennummer für jede Zeile im CTE zu generieren. SELECT NULL wird verwendet, da keine bestimmte Reihenfolge erforderlich ist, für eine Fensterfunktion jedoch eine ORDER BY-Klausel erforderlich ist.
Eine andere Möglichkeit, dasselbe zu erreichen, wäre die Verwendung einer IDENTITY-Spalte, die jedoch andere Auswirkungen hat und Änderungen an einer vorhandenen Tabelle oder der Erstellung einer temporären Tabelle erfordert. Mit der Fensterfunktion ROW_NUMBER in einem CTE kann diese Identität im laufenden Betrieb generiert werden.
So beantworten Sie Ihre spezielle Frage:
Es ordnet die Zeilen in E4 'zufällig' an, bevor die Fensterfunktion ROW_NUMBER () auf diese Ergebnismenge angewendet wird, um eine Liste von Zeilennummern zu erstellen, die der Anzahl der Zeilen in E4 entspricht. OVER kann übersetzt werden als "Holen Sie sich eine Ergebnismenge mit dieser Reihenfolge und Partitionierung und wenden Sie diese Fensterfunktion (OVER) auf diese Ergebnismenge an, unabhängig von der Reihenfolge in der SELECT-Hauptanweisung."
Weitere Infos: OVER-Klausel
quelle