Montag, April 06, 2020

dense_rank zur Bestimmung von Maximalwerten pro Gruppe

Wie man nicht nur am Alter des letzten Eintrags, sondern auch am Titel des vorliegenden erkennen kann, komme ich derzeit selten dazu, mir Gedanken über technische Fragen und ihre schriftliche Zusammenfassung zu machen: und da werden die Titel dann offenbar sperriger...

Jonathan Lewis behandelt in seinem Blog eine Einsatzmöglichkeit der analytischen dense_rank Funktion, der mir gelegentlich auch schon geholfen hätte. Die Fragestellung ist dabei die der jüngsten Bestellung, die in einer Transaktionstabelle für jeden einzelnen Kunden vorliegt. Dazu werden diverse Varianten mit korrelierten und nicht korrelierten Subqueries überprüft, die jeweils das Problem mit sich bringen, dass die Transaktionstabelle zweimal gelesen werden muss. Vermeidbar ist das mit analytischen Funktionen, wobei zunächst eine inline-View mit einem analytischen MAX verwendet wird, bei dem dann in der rahmenden Query eine Filterung auf diese maximalen Werte erfolgt - und das wäre wahrscheinlich auch die Lösung gewesen, die mir in diesem Fall eingefallen wäre. Noch effizienter ist hier aber ein "max (...) keep (dense_rank last order by ...)". Voraussetzung ist dabei, dass es möglich ist, einen unique constraint über die Gruppierungsspalte und die order by Spalte zu legen, da es sonst zu falschen Ergebnissen kommen kann. Grundsätzlich kann die Strategie aber sehr nützlich sein, wenn die Zahl der Datensätze in der Transaktionstabelle im Verhältnis zur Anzahl der (distinkten) Werte in der gruppierten Ergebnismenge der Query hoch ist.

Wenn ich das noch mal überfliege, wird mir klar, dass nicht nur die Titel unter der selteneren Übung beim Zusammenfassen leiden...

Keine Kommentare:

Kommentar veröffentlichen