Wie man Daten in SQL einordnet: Eine Einführung in Fensterfunktionen
Ethan Miller
Product Engineer · Leapcell

Key Takeaways
- SQL bietet verschiedene Ranking-Funktionen zum Ordnen und Analysieren von Daten.
- Wählen Sie die richtige Funktion basierend darauf, wie Sie mit Gleichständen umgehen möchten.
- Verwenden Sie
PARTITION BY
, um innerhalb bestimmter Gruppen zu ranken.
Einführung
Das Ranking in SQL ist essentiell, um Daten zu ordnen, mit Gleichständen umzugehen und Ergebnisse basierend auf der Position zu filtern. SQL bietet verschiedene Fensterfunktionen—ROW_NUMBER()
, RANK()
, DENSE_RANK()
und NTILE()
—um diese Ziele zu erreichen. Jede dient leicht unterschiedlichen Anwendungsfällen.
1. ROW_NUMBER()
-
Weist jeder Zeile eine eindeutige fortlaufende Nummer zu, ohne Gleichstände zu berücksichtigen.
-
Syntax:
ROW_NUMBER() OVER ( [PARTITION BY partition_expr] ORDER BY order_expr [ASC|DESC] ) AS row_num
-
Beispiel: Eindeutige Zeilennummern nach absteigender Punktzahl zuweisen:
SELECT student_name, score, ROW_NUMBER() OVER (ORDER BY score DESC) AS row_num FROM students;
2. RANK()
-
Weist gleichen Werten denselben Rang zu, lässt aber Lücken in den nachfolgenden Rängen.
-
Syntax:
RANK() OVER ( [PARTITION BY partition_expr] ORDER BY order_expr [ASC|DESC] ) AS rank
-
Beispiel: Studenten ranken, wobei Lücken erlaubt sind:
SELECT student_name, score, RANK() OVER (ORDER BY score DESC) AS rank FROM students;
Wenn sich zwei Studenten die höchste Punktzahl teilen, haben beide Rang 1, und der nächste Rang ist 3.
3. DENSE_RANK()
-
Ähnlich wie
RANK()
, aber lässt keine Lücken nach Gleichständen. -
Syntax:
DENSE_RANK() OVER ( [PARTITION BY partition_expr] ORDER BY order_expr [ASC|DESC] ) AS dense_rank
-
Beispiel:
SELECT student_name, score, DENSE_RANK() OVER (ORDER BY score DESC) AS dense_rank FROM students;
Wenn zwei Studenten den ersten Platz belegen, haben beide Rang 1, und der nächste Rang ist 2.
4. NTILE(N)
-
Teilt Zeilen in N Buckets auf und weist Bucket-Nummern von 1 bis N zu.
-
Syntax:
NTILE(N) OVER ( [PARTITION BY partition_expr] ORDER BY order_expr [ASC|DESC] ) AS tile
-
Beispiel:
SELECT student_name, score, NTILE(4) OVER (ORDER BY score DESC) AS quartile FROM students;
Teilt Studenten anhand ihrer Punktzahl in vier Gruppen ein.
5. Partitionierung
-
PARTITION BY
ermöglicht das Ranking innerhalb von Gruppen (z. B. pro Abteilung oder Fach). -
Beispiel: Studenten innerhalb jeder Klasse ranken:
SELECT class, student_name, score, RANK() OVER ( PARTITION BY class ORDER BY score DESC ) AS class_rank FROM students;
6. Warum eine auswählen?
Funktion | Behandelt Gleichstände | Lücken nach Gleichständen | Anwendungsfall |
---|---|---|---|
ROW_NUMBER() | Nein | Nein (immer 1,2,3...) | Wenn jede Zeile eindeutig nummeriert werden muss |
RANK() | Ja | Ja | Wenn sich Gleichstände den Rang teilen und Lücken akzeptabel sind |
DENSE_RANK() | Ja | Nein | Wenn sich Gleichstände den Rang teilen, Lücken aber nicht erlaubt sind |
NTILE(N) | N/A | N/A | Wenn Zeilen in gleich große Buckets aufgeteilt werden |
7. Filtern von Top‑N-Ergebnissen
Um beispielsweise die Top 3 Studenten mit RANK()
zu erhalten:
WITH ranked AS ( SELECT student_name, score, RANK() OVER (ORDER BY score DESC) AS rank FROM students ) SELECT student_name, score FROM ranked WHERE rank <= 3;
Diese Abfrage berücksichtigt Gleichstände. Möchten Sie genau 3 Zeilen? Verwenden Sie stattdessen ROW_NUMBER()
.
8. Beispiele aus der Praxis
-
Umsatz pro Geschäft pro Produkt:
SELECT product, store_id, sales, RANK() OVER ( PARTITION BY product ORDER BY sales DESC ) AS sales_rank FROM sales_data;
Hilft bei der Identifizierung der umsatzstärksten Geschäfte pro Produkt.
-
Gehaltsanalyse der Abteilung:
WITH dept_ranked AS ( SELECT department_id, employee_name, salary, RANK() OVER ( PARTITION BY department_id ORDER BY salary DESC ) AS dept_rank FROM employees ) SELECT * FROM dept_ranked WHERE dept_rank = 1;
Findet den bestbezahlten Mitarbeiter pro Abteilung.
9. Zusammenfassung
- Wählen Sie die Fensterfunktion basierend auf der Behandlung von Gleichständen und den Präferenzen für Lücken.
- Verwenden Sie
PARTITION BY
für die Gruppierung. - Verwenden Sie
ORDER BY
, um die Ranking-Logik zu definieren. - Filtern Sie die Ergebnisse mit
WHERE
oder CTE für gezielte Ergebnisse.
FAQs
Sie werden verwendet, um Daten innerhalb von Ergebnismengen zu ordnen und zu analysieren.
RANK() lässt Lücken nach Gleichständen; DENSE_RANK() nicht.
Verwenden Sie die PARTITION BY-Klausel in Ihrer Fensterfunktion.
We are Leapcell, your top choice for hosting backend projects.
Leapcell is the Next-Gen Serverless Platform for Web Hosting, Async Tasks, and Redis:
Multi-Language Support
- Develop with Node.js, Python, Go, or Rust.
Deploy unlimited projects for free
- pay only for usage — no requests, no charges.
Unbeatable Cost Efficiency
- Pay-as-you-go with no idle charges.
- Example: $25 supports 6.94M requests at a 60ms average response time.
Streamlined Developer Experience
- Intuitive UI for effortless setup.
- Fully automated CI/CD pipelines and GitOps integration.
- Real-time metrics and logging for actionable insights.
Effortless Scalability and High Performance
- Auto-scaling to handle high concurrency with ease.
- Zero operational overhead — just focus on building.
Explore more in the Documentation!
Follow us on X: @LeapcellHQ