


Detaillierte Erläuterung der Verwendung von OVER (PARTITION BY ..) in Oracle-Abfragen
Dieser Artikel stellt hauptsächlich die Verwendung von OVER (PARTITION BY ..) in Oracle-Abfragen vor. Ich hoffe, dass er allen helfen kann. Um das Lernen und Testen für alle zu erleichtern, werden alle Beispiele unter Oracles eigenem Benutzer Scott erstellt.
Hinweis: Die rote Reihenfolge nach im Titel weist darauf hin, dass bei Verwendung dieser Methode „Reihenfolge nach“ angegeben werden muss.
1. rank()/dense_rank() over(partition by ...order by ...)
Jetzt hat der Kunde eine solche Nachfrage, fragen Sie den Mitarbeiter mit dem höchsten Gehalt in Ich glaube, dass Studenten mit bestimmten Oracle-Anwendungskenntnissen die folgenden SQL-Anweisungen schreiben können:
select e.ename, e.job, e.sal, e.deptno from scott.emp e, (select e.deptno, max(e.sal) sal from scott.emp e group by e.deptno) me where e.deptno = me.deptno and e.sal = me.sal;
Bei der Erfüllung der Kundenbedürfnisse sollte sich jeder daran gewöhnen Überlegen Sie genau, ob es auch andere Möglichkeiten gibt. Dies ist sicher, verwenden Sie einfach die Syntax „rank() over(partition by...)“ oder „dense_rank() over(partition by…)“ im Titel dieses Abschnitts. Die SQL lautet wie folgt:
select e.ename, e.job, e.sal, e.deptno from (select e.ename, e.job, e.sal, e.deptno, rank() over(partition by e.deptno order by e.sal desc) rank from scott.emp e) e where e.rank = 1;
select e.ename, e.job, e.sal, e.deptno from (select e.ename, e.job, e.sal, e.deptno, dense_rank() over(partition by e.deptno order by e.sal desc) rank from scott.emp e) e where e.rank = 1;
Warum kommt es zum gleichen Ergebnis wie in der obigen Aussage? Hier ist eine ergänzende Erklärung der syntax rank()/dense_rank() over(partition by e.deptno order by e.sal desc).
über: Unter welchen Bedingungen.
Partition nach e.deptno: Teilen (Partition) durch Abteilungsnummer.
Reihenfolge nach e.sal desc: Sortieren nach Gehalt von hoch nach niedrig (bei Verwendung von rank()/dense_rank() muss „Reihenfolge nach“ enthalten sein, andernfalls ist dies illegal)
rank()/dense_rank(): Grading
Die Bedeutung der gesamten Aussage ist: Auf der Grundlage der Aufteilung nach Abteilungen werden die Mitarbeiter je nach Gehalt von hoch nach niedrig eingestuft und die „Level“ wird durch eine große Zahl dargestellt (der Mindestwert muss 1 sein).
Was ist also der Unterschied zwischen rank() und dense_rank()?
rank(): Sprungsortierung, wenn es zwei erste Ebenen gibt, ist die nächste die dritte Ebene.
dense_rank(): Kontinuierliche Sortierung, wenn es zwei erste Ebenen gibt, ist die nächste immer noch die zweite Ebene.
Kleine Hausaufgabe: Fragen Sie die Mitarbeiterinformationen zum Mindestlohn der Abteilung ab.
2. min()/max() over(partition by...)
Nachdem wir das höchste/minimale Gehalt der Abteilung erhalten haben, kommt die Nachfrage des Kunden erneut Mitarbeiterinformationen Berechnen Sie gleichzeitig die Differenz zwischen dem Gehalt des Mitarbeiters und dem Höchst-/Mindestgehalt der Abteilung. Dies ist relativ einfach. Basierend auf der Groupby-Anweisung im ersten Abschnitt ändern Sie sie wie folgt:
select e.ename, e.job, e.sal, e.deptno, e.sal - me.min_sal diff_min_sal, me.max_sal - e.sal diff_max_sal from scott.emp e, (select e.deptno, min(e.sal) min_sal, max(e.sal) max_sal from scott.emp e group by e.deptno) me where e.deptno = me.deptno order by e.deptno, e.sal;
Oben haben wir min() und max( ), ersterer ermittelt den Minimalwert und letzterer ermittelt den Maximalwert. Welchen Effekt hat es, wenn diese beiden Methoden zusammen mit over(partition by...) verwendet werden? Schauen Sie sich die folgende SQL-Anweisung an:
select e.ename, e.job, e.sal, e.deptno, nvl(e.sal - min(e.sal) over(partition by e.deptno), 0) diff_min_sal, nvl(max(e.sal) over(partition by e.deptno) - e.sal, 0) diff_max_sal from scott.emp e;
Sie können sehen, dass min() und max( ) ermittelt tatsächlich die minimalen und maximalen Werte, basiert jedoch auf Partition für Partition.
Kleine Hausaufgabe: Wenn Sie in diesem Beispiel „Ordnung nach“ hinzufügen, was wird das Ergebnis sein?
3. Lead()/lag() over(partition by ... order by ...)
Chinesen lieben es, zu vergleichen, ihr Gesicht zu wahren und sind weltberühmt. Dem Kunden gefiel dies noch besser, nachdem er es mit dem Höchst-/Mindestgehalt verglichen hatte. Diesmal stellte er eine eher ungewöhnliche Forderung, nämlich die Differenz zwischen seinem persönlichen Gehalt und dem Gehalt von zu berechnen eine Person höher oder niedriger als er. Diese Anforderung ist mir wirklich sehr peinlich. Ich weiß nicht, wie ich sie in der Groupby-Anweisung umsetzen soll. Aber. . . . Jetzt, wo wir über(partitionieren nach...) haben, sieht alles so einfach aus. Wie folgt:
select e.ename, e.job, e.sal, e.deptno, lead(e.sal, 1, 0) over(partition by e.deptno order by e.sal) lead_sal, lag(e.sal, 1, 0) over(partition by e.deptno order by e.sal) lag_sal, nvl(lead(e.sal) over(partition by e.deptno order by e.sal) - e.sal, 0) diff_lead_sal, nvl(e.sal - lag(e.sal) over(partition by e.deptno order by e.sal), 0) diff_lag_sal from scott.emp e;
Glauben Sie, dass es sich nach dem Lesen des obigen Satzes um einen falschen Alarm handelte? Lassen Sie uns die beiden oben verwendeten neuen Methoden erklären.
lead(column name,n,m): Der Wert von
lag(Spaltenname,n,m): Der Wert von
Im Folgenden sind die Anwendungen einiger häufig verwendeter Methoden in dieser Grammatik aufgeführt (Hinweis: Methoden mit einer order by-Klausel geben an, dass order by verwendet werden muss, wenn diese Methode verwendet wird):
select e.ename, e.job, e.sal, e.deptno, first_value(e.sal) over(partition by e.deptno) first_sal, last_value(e.sal) over(partition by e.deptno) last_sal, sum(e.sal) over(partition by e.deptno) sum_sal, avg(e.sal) over(partition by e.deptno) avg_sal, count(e.sal) over(partition by e.deptno) count_num, row_number() over(partition by e.deptno order by e.sal) row_num from scott.emp e;
Nach dem Lesen dieses Artikels haben Sie möglicherweise einige Missverständnisse, das heißt, OVER (PARTITION BY ..) ist besser als GROUP BY. Ersteres kann das nicht ersetzen Letzteres und die Ausführungseffizienz des ersteren ist nicht so hoch wie die des letzteren, aber ersteres bietet mehr Funktionen, daher hoffe ich, dass Sie bei der Verwendung entsprechend Ihren Anforderungen wählen können.
Verwandte Empfehlungen:
Tipps zur Oracle-Programmentwicklung
Vergleich der Fälle von in Oracle verwendeten Triggern und von in MySQL verwendeten Triggern
99 häufig verwendete Abfrageanweisungen in Oracle-Datenbanken
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Verwendung von OVER (PARTITION BY ..) in Oracle-Abfragen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



Mit der Verschlüsselung von Oracle View können Sie Daten in der Ansicht verschlüsseln und so die Sicherheit sensibler Informationen verbessern. Die Schritte umfassen: 1) Erstellen des Master -Verschlüsselungsschlüssels (MEK); 2) Erstellen einer verschlüsselten Ansicht, der Ansicht und der Verschlüsselung der Ansicht und der MEK angeben; 3) Benutzern Sie die Benutzer, auf die verschlüsselte Ansicht zuzugreifen. Wie verschlüsselte Ansichten funktionieren: Wenn ein Benutzer nach einer verschlüsselten Ansicht nachgefragt wird, verwendet Oracle MEK, um Daten zu entschlüsseln und sicherzustellen, dass nur autorisierte Benutzer auf lesbare Daten zugreifen können.

Für das Löschen aller Daten in Oracle sind die folgenden Schritte erforderlich: 1. Erstellen Sie eine Verbindung; 2. Deaktivieren Sie fremde Schlüsselbeschränkungen; 3.. Tabellendaten löschen; 4. Transaktionen einreichen; 5. Aktivieren Sie fremde Schlüsselbeschränkungen (optional). Stellen Sie sicher, dass Sie die Datenbank vor der Ausführung sichern, um den Datenverlust zu verhindern.

Deinstallieren Sie die Methode für Oracle -Installationsfehler: Schließen Sie den Oracle -Service, löschen Sie Oracle -Programmdateien und Registrierungsschlüssel, Deinstallieren Sie Oracle -Umgebungsvariablen und starten Sie den Computer neu. Wenn das Deinstall fehlschlägt, können Sie das Oracle Universal Deinstall -Tool manuell deinstallieren.

Lösungen für Oracle können nicht geöffnet werden, einschließlich: 1. Starten Sie den Datenbankdienst; 2. Starten Sie den Zuhörer; 3.. Hafenkonflikte prüfen; 4. Umgebungsvariablen korrekt einstellen; 5. Stellen Sie sicher, dass die Firewall- oder Antivirus -Software die Verbindung nicht blockiert. 6. Überprüfen Sie, ob der Server geschlossen ist. 7. Verwenden Sie RMAN, um korrupte Dateien wiederherzustellen. 8. Überprüfen Sie, ob der TNS -Dienstname korrekt ist. 9. Netzwerkverbindung prüfen; 10. Oracle Software neu installieren.

Oracle Ungültige numerische Fehler können durch Fehlpaarung des Datentyps, numerische Überlauf, Datenkonvertierungsfehler oder Datenbeschäftigung verursacht werden. Zu den Schritten zur Fehlerbehebung gehören das Überprüfen von Datentypen, das Erkennen digitaler Überläufe, das Überprüfen von Datenkonvertierungen, das Überprüfen der Datenbeschädigung und das Erforschen anderer möglicher Lösungen wie das Konfigurieren des Parameters nls_numeric_characters und das Aktivieren der Datenüberprüfungs -Protokollierung.

Oracle Database Paging verwendet Rownum Pseudo-Säulen oder Abrufanweisungen zum Implementieren: Rownum Pseudo-Säulen werden verwendet, um Ergebnisse nach Zeilennummern zu filtern und für komplexe Abfragen geeignet sind. Die Abrufanweisung wird verwendet, um die angegebene Anzahl der ersten Zeilen zu erhalten, und eignet sich für einfache Abfragen.

In Oracle kann die For -Loop -Schleife Cursors dynamisch erzeugen. Die Schritte sind: 1. Definieren Sie den Cursortyp; 2. Erstellen Sie die Schleife; 3.. Erstellen Sie den Cursor dynamisch; 4. Führen Sie den Cursor aus; 5. Schließen Sie den Cursor. Beispiel: Ein Cursor kann mit dem Zyklus für Kreislauf erstellt werden, um die Namen und Gehälter der Top 10 Mitarbeiter anzuzeigen.

Die Methode zur Lösung des Oracle Cursor Closeure -Problems umfasst: explizit den Cursor mithilfe der Close -Anweisung schließen. Deklarieren Sie den Cursor in der für Aktualisierungsklausel so, dass er nach Beendigung des Umfangs automatisch schließt. Deklarieren Sie den Cursor in der Verwendung der Verwendung so, dass er automatisch schließt, wenn die zugehörige PL/SQL -Variable geschlossen ist. Verwenden Sie die Ausnahmebehandlung, um sicherzustellen, dass der Cursor in jeder Ausnahmesituation geschlossen ist. Verwenden Sie den Verbindungspool, um den Cursor automatisch zu schließen. Deaktivieren Sie die Automatikübermittlung und Verzögerung des Cursors Schließen.
