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!