Fensterfunktionen (OVER / PARTITION BY)
Oracle
SELECT name, department, salary,
ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS row_no,
RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank_no,
LAG(salary) OVER (PARTITION BY department ORDER BY salary) AS prev_salary
FROM employee;Fensterfunktionen rechnen für jede Zeile über ein 'Fenster', ohne Zeilen zu gruppieren (ohne die Zeilenzahl zu verringern). PARTITION BY teilt das Fenster, ORDER BY sortiert es. Oracle war Vorreiter bei diesen analytischen Funktionen und bietet einen umfangreichen Satz mit ROW_NUMBER, RANK, DENSE_RANK, LAG/LEAD und SUM() OVER.
PostgreSQL
SELECT name, department, salary,
ROW_NUMBER() OVER w AS row_no,
RANK() OVER w AS rank_no,
LEAD(salary) OVER w AS next_salary
FROM employee
WINDOW w AS (PARTITION BY department ORDER BY salary DESC);PostgreSQL unterstützt alle Standard-Fensterfunktionen und erlaubt, eine wiederholte Fensterdefinition mit WINDOW ... AS zu benennen. Mit Frame-Definitionen ROWS/RANGE/GROUPS berechnest du laufende Summen, gleitende Durchschnitte und Ähnliches.
MySQL
SELECT name, department, salary,
ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS row_no,
DENSE_RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank_no,
LAG(salary) OVER (PARTITION BY department ORDER BY salary) AS prev_salary
FROM employee;MySQL 8.0 (und MariaDB 10.2+) unterstützen Fensterfunktionen; davor wurden sie mit Benutzervariablen oder Unterabfragen nachgebildet. ROW_NUMBER, RANK, DENSE_RANK, NTILE, LAG/LEAD, FIRST_VALUE/LAST_VALUE und die OVER-Form der Aggregatfunktionen sind verfügbar.
SQL Server
SELECT name, department, salary,
ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS row_no,
RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank_no,
SUM(salary) OVER (PARTITION BY department) AS dept_total
FROM employee;SQL Server unterstützt Ranking-Fensterfunktionen seit 2005 und Aggregate mit Frames sowie Funktionen wie LAG/LEAD seit 2012. ROW_NUMBER wird häufig für Paging (mit OFFSET/FETCH) und zum Ermitteln der Top-N-Zeilen pro Gruppe genutzt.
MongoDB
// Closest equivalent: $setWindowFields (MongoDB 5.0+)
db.employee.aggregate([
{ $setWindowFields: {
partitionBy: "$department",
sortBy: { salary: -1 },
output: { row_no: { $rank: {} },
prev_salary: { $shift: { output: "$salary", by: -1 } } }
} }
])Die Stage $setWindowFields in MongoDB 5.0+ entspricht SQL-Fensterfunktionen: Das Fenster wird mit partitionBy und sortBy definiert und liefert Ausgaben wie $rank/$denseRank/$documentNumber, $shift (LAG/LEAD) und laufende Summen. In älteren Versionen wurde dies mit $group + Code gelöst.
Redis
# Not applicable: Redis has no window functions.Redis bietet keine analytischen Fensterfunktionen. Für sortierte Ergebnisse und Ranglisten nutze die Struktur Sorted Set (ZSET): Scores mit ZADD vergeben, den Rang mit ZRANK/ZREVRANK und Bereiche mit ZRANGE lesen. Komplexe Analytik erfolgt in der Anwendung.
Elasticsearch
# Closest equivalent: top_hits and pipeline aggregations
GET employee/_search
{
"size": 0,
"aggs": { "dept": { "terms": { "field": "department" },
"aggs": { "top_paid": { "top_hits": {
"sort": [ { "salary": "desc" } ], "size": 3 } } } } }
}Elasticsearch hat keine direkten Fensterfunktionen. Für die Top-N-Datensätze pro Gruppe nutze eine Sub-Aggregation 'top_hits'; für gleitende/kumulative Berechnungen Pipeline-Aggregationen wie 'derivative', 'cumulative_sum' und 'moving_fn'. Sortierung und Partitionierung erfolgen mit einer terms-Aggregation.