QUALIFY
Was ist QUALIFY?
QUALIFY ist ein SQL-Filter, der nach der Ausführung von Window Functions angewendet wird. Er ermöglicht das Auswählen von Zeilen auf Basis berechneter Window-Ergebnisse wie ROW_NUMBER(), RANK oder LAG.
Warum ist QUALIFY nützlich?
QUALIFY ermöglicht das Filtern von Window-Ergebnissen ohne zusätzliche CTEs oder Sub-Selects. Dadurch werden Abfragen schlanker, leichter zu lesen und oft auch performanter, da unnötige Abfrageebenen entfallen.
Einsatz im Data Warehousing
QUALIFY kann beim Zugriff auf Data-Vault-Satellites ohne End-Dating eingesetzt werden, unter anderem für:
- Ermitteln der gültigen Datensätze zur Ableitung einer Slowly Changing Dimension Type 1 (SCD1)
- Bestimmen der relevanten Satellite-Versionen für einen PIT-Snapshot, wenn kein
ASOF JOINverfügbar ist
Durch das Filtern auf Window-Ergebnissen lassen sich dabei die jeweils aktuellen oder zeitlich passenden Einträge identifizieren.
Beispiel
select customer_key
, order_date
, total_price
from orders
qualify row_number() over
(partition by customer_key
order by order_date desc) = 1;
Beispiel
select customer_key
, order_date
, total_price
from orders
qualify row_number() over
(partition by customer_key
order by order_date desc) = 1;
Beispiel
select customer_key
, order_date
, total_price
from orders
qualify row_number() over
(partition by customer_key
order by order_date desc) = 1;
Beispiel
select customer_key
, order_date
, total_price
from orders
qualify row_number() over
(partition by customer_key
order by order_date desc) = 1;
Beispiel
select customer_key
, order_date
, total_price
from orders
qualify row_number() over
(partition by customer_key
order by order_date desc) = 1;
Hinweis für PostgreSQL
In PostgreSQL ist die QUALIFY-Klausel derzeit noch nicht offiziell verfügbar. Es existiert jedoch ein Proof-of-Concept-Patch (siehe Mailing-List Thread: „Proposal: QUALIFY clause“) vom Juli 2025.
Als Alternative kann man in PostgreSQL zum Beispiel eine Unterabfrage oder CTE verwenden, in der zuerst die Window-Function berechnet wird, und anschließend im äußeren SELECT gefiltert wird.
Beispiel
select customer_key
, order_date
, total_price
from orders
qualify row_number() over
(partition by customer_key
order by order_date desc) = 1;
Fazit
QUALIFYermöglicht das direkte Filtern von Window-Ergebnissen und reduziert dadurch den Bedarf an CTEs oder Sub-Selects.- Die Syntax führt zu kompakterem und klarer strukturiertem SQL und erleichtert typische Aufgaben wie das Auswählen aktueller oder zeitlich passender Datensätze.
- In Data-Warehousing-Szenarien bietet das Feature eine effiziente Möglichkeit, versions- oder zeitbezogene Daten zu bestimmen.