Heim Datenbank MySQL-Tutorial Detaillierte Erläuterung der Verwendung von OVER (PARTITION BY ..) in Oracle-Abfragen

Detaillierte Erläuterung der Verwendung von OVER (PARTITION BY ..) in Oracle-Abfragen

Dec 11, 2017 pm 01:23 PM
oracle over partition

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;
Nach dem Login kopieren

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;
Nach dem Login kopieren

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;
Nach dem Login kopieren

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;
Nach dem Login kopieren

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;
Nach dem Login kopieren

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;
Nach dem Login kopieren

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 , der in der n-ten Zeile nach dem aktuellen Datensatz aufgezeichnet wird, wenn nicht, ist der Standardwert m; Parameter n,m, dann finden Sie den Wert des Datensatzes in der ersten Zeile nach dem aktuellen Datensatz. Wenn nicht, ist der Standardwert null.

lag(Spaltenname,n,m): Der Wert von wird in der n-ten Zeile vor dem aktuellen Datensatz aufgezeichnet. Wenn nicht, ist der Standardwert m; Parameter n,m, dann finden Sie den Wert des Datensatzes in der ersten Zeile vor dem aktuellen Datensatz. Wenn nicht, ist der Standardwert null.

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 Login kopieren

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!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

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

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

So verschlüsseln Sie die Oracle -Ansicht So verschlüsseln Sie die Oracle -Ansicht Apr 11, 2025 pm 08:30 PM

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.

So löschen Sie alle Daten von Oracle So löschen Sie alle Daten von Oracle Apr 11, 2025 pm 08:36 PM

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.

Wie man die Oracle -Installation deinstalliert Wie man die Oracle -Installation deinstalliert Apr 11, 2025 pm 08:24 PM

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.

Was tun, wenn das Orakel nicht geöffnet werden kann Was tun, wenn das Orakel nicht geöffnet werden kann Apr 11, 2025 pm 10:06 PM

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.

So überprüfen Sie ungültige Nummern von Oracle So überprüfen Sie ungültige Nummern von Oracle Apr 11, 2025 pm 08:27 PM

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.

So paginieren Sie die Oracle -Datenbank So paginieren Sie die Oracle -Datenbank Apr 11, 2025 pm 08:42 PM

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.

So erstellen Sie Cursor in Oracle Loop So erstellen Sie Cursor in Oracle Loop Apr 12, 2025 am 06:18 AM

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.

So lösen Sie das Problem des Schließens von Oracle Cursor So lösen Sie das Problem des Schließens von Oracle Cursor Apr 11, 2025 pm 10:18 PM

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.

See all articles