Heim >Datenbank >MySQL-Tutorial >Wie unterscheidet sich die „PARTITION BY'-Klausel von Oracle mit und ohne „KEEP'?

Wie unterscheidet sich die „PARTITION BY'-Klausel von Oracle mit und ohne „KEEP'?

Susan Sarandon
Susan SarandonOriginal
2024-12-21 00:45:10664Durchsuche

How Does Oracle's `PARTITION BY` Clause Differ with and without `KEEP`?

PARTITION BY mit und ohne KEEP in Oracle

Einführung

In Oracle die PARTITION Die BY-Klausel wird verwendet, um eine Datenmenge in Teilmengen zu unterteilen, um Aggregatberechnungen durchzuführen. Die KEEP-Klausel gibt an, welche Zeilen von jeder Partition beibehalten werden sollen. In diesem Artikel werden die Unterschiede zwischen der Verwendung von PARTITION BY mit und ohne KEEP erläutert.

Abfragen mit und ohne KEEP

Bedenken Sie die folgenden zwei Abfragen:

SELECT
    empno,
    deptno,
    sal,
    MIN(sal) OVER (PARTITION BY deptno) AS "Lowest",
    MAX(sal) OVER (PARTITION BY deptno) AS "Highest"
FROM
    empl;

SELECT
    empno,
    deptno,
    sal,
    MIN(sal) KEEP (DENSE_RANK FIRST ORDER BY sal) OVER (PARTITION BY deptno) AS "Lowest",
    MAX(sal) KEEP (DENSE_RANK LAST ORDER BY sal) OVER (PARTITION BY deptno) AS "Highest"
FROM
    empl;

Die erste Abfrage verwendet PARTITION BY ohne KEEP, während die zweite Abfrage KEEP (DENSE_RANK) verwendet. Beide Abfragen berechnen die niedrigsten und höchsten Gehälter für jede Abteilung.

KEEP (DENSE_RANK FIRST ORDER BY sal)

In der zweiten Abfrage wird der Wert KEEP (DENSE_RANK FIRST ORDER BY Die Sal-Klausel weist Oracle an, nur die erste Zeile für jede Abteilung beizubehalten, nachdem die Zeilen nach Gehalt in aufsteigender Reihenfolge sortiert wurden. Die Funktion DENSE_RANK weist jeder Zeile innerhalb jeder Partition einen Rang zu, und der erste Rang gibt das niedrigste Gehalt an.

Unterschied zwischen den Abfragen

Die zweite Abfrage ist redundant, weil MIN und DENSE_RANK FIRST arbeiten beide mit derselben Sal-Spalte. Sie liefern das gleiche Ergebnis wie die erste Abfrage, die das niedrigste Gehalt direkt berechnet, ohne KEEP zu verwenden.

Das liegt daran, dass die Klausel KEEP (DENSE_RANK FIRST ORDER BY sal) nur dann nützlich ist, wenn die Aggregation MIN oder MAX ist wird auf einer anderen Spalte als der Bestellspalte durchgeführt. In solchen Fällen ermöglicht die KEEP-Klausel eine genauere Kontrolle darüber, welche Zeilen in die Berechnung einbezogen werden.

Beispiel

Betrachten Sie die folgende Abfrage:

SELECT
    name,
    sal,
    deptno,
    MIN(sal) KEEP (DENSE_RANK FIRST ORDER BY sal) OVER (PARTITION BY deptno) AS "Lowest",
    MIN(name) KEEP (DENSE_RANK FIRST ORDER BY sal) OVER (PARTITION BY deptno) AS "Lowest Employee"
FROM
    test;

Diese Abfrage berechnet das niedrigste Gehalt für jede Abteilung sowie den Namen des Mitarbeiters mit dem niedrigsten Gehalt. Die Klausel KEEP (DENSE_RANK FIRST ORDER BY sal) ist in diesem Fall notwendig, da sie sicherstellt, dass nur das niedrigste Gehalt und der entsprechende Mitarbeitername zurückgegeben werden, auch wenn es mehrere Zeilen mit demselben niedrigsten Gehalt gibt.

Das obige ist der detaillierte Inhalt vonWie unterscheidet sich die „PARTITION BY'-Klausel von Oracle mit und ohne „KEEP'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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