DBAtlas · Atlas für Datenbankbetrieb

Fensterfunktionen (ROW_NUMBER/RANK/LAG)

Oracle

-- Rank by amount within each city and fetch the previous value:
SELECT city, name, amount,
  ROW_NUMBER() OVER (PARTITION BY city ORDER BY amount DESC) AS row_num,
  RANK()       OVER (PARTITION BY city ORDER BY amount DESC) AS rnk,
  LAG(amount)   OVER (PARTITION BY city ORDER BY created_at)      AS prev_amount
FROM sale;

Oracle war Vorreiter bei analytischen (Fenster-)Funktionen; ROW_NUMBER, RANK, DENSE_RANK, LAG, LEAD, SUM/AVG OVER, NTILE und FIRST_VALUE werden vollständig unterstützt. Innerhalb von OVER definiert PARTITION BY die Gruppen, ORDER BY die Reihenfolge und der Frame (ROWS/RANGE BETWEEN) das gleitende Fenster.

PostgreSQL

-- Window functions with OVER():
SELECT city, name, amount,
  ROW_NUMBER() OVER (PARTITION BY city ORDER BY amount DESC) AS row_num,
  RANK()       OVER (PARTITION BY city ORDER BY amount DESC) AS rnk,
  LAG(amount)   OVER (PARTITION BY city ORDER BY created_at)      AS prev_amount
FROM sale;

PostgreSQL unterstützt Fensterfunktionen vollständig mit Standard-SQL-Syntax. ROW_NUMBER/RANK/DENSE_RANK, LAG/LEAD, Aggregate mit OVER, NTILE und FIRST_VALUE/LAST_VALUE sind verfügbar. Wiederholte Fensterdefinitionen lassen sich mit der WINDOW-Klausel benennen und gemeinsam nutzen.

MySQL

-- MySQL 8.0+ window functions:
SELECT city, name, amount,
  ROW_NUMBER() OVER (PARTITION BY city ORDER BY amount DESC) AS row_num,
  RANK()       OVER (PARTITION BY city ORDER BY amount DESC) AS rnk,
  LAG(amount)   OVER (PARTITION BY city ORDER BY created_at)      AS prev_amount
FROM sale;

MySQL hat Fensterfunktionen in Version 8.0 eingeführt (auch MariaDB 10.2+ unterstützt sie). ROW_NUMBER, RANK, DENSE_RANK, LAG, LEAD, NTILE und Aggregate mit OVER sind verfügbar. Versionen vor 8.0 fehlen diese Funktionen; früher wurden sie mit Benutzervariablen nachgebildet.

SQL Server

-- Window functions with OVER():
SELECT city, name, amount,
  ROW_NUMBER() OVER (PARTITION BY city ORDER BY amount DESC) AS row_num,
  RANK()       OVER (PARTITION BY city ORDER BY amount DESC) AS rnk,
  LAG(amount)   OVER (PARTITION BY city ORDER BY created_at)      AS prev_amount
FROM dbo.sale;

SQL Server unterstützt Fensterfunktionen seit 2005 (ROW_NUMBER/RANK) und 2012 (LAG/LEAD, Framing, Aggregate mit OVER). PARTITION BY, ORDER BY und der ROWS/RANGE-Frame sind vollständig verfügbar. Für Paging sind OFFSET/FETCH oder ROW_NUMBER üblich.

MongoDB

// Window calculations with $setWindowFields:
db.sale.aggregate([
  { $setWindowFields: {
      partitionBy: "$city",
      sortBy: { amount: -1 },
      output: {
        row_num: { $documentNumber: {} },
        rnk: { $rank: {} },
        prev_amount: { $shift: { output: "$amount", by: -1 } }
      }
  } }
])

Die in MongoDB 5.0 eingeführte Aggregation-Stage $setWindowFields bietet Fensterfunktionen: $documentNumber (ROW_NUMBER), $rank/$denseRank, $shift (LAG/LEAD), Aggregatfunktionen und gleitende Fenster (window: { documents/range }). partitionBy und sortBy entsprechen PARTITION BY/ORDER BY in SQL.

Redis

# Not applicable: there are no SQL-like window functions.

Redis ist ein Key-Value-Store ohne analytische Fensterfunktionen. Für sortierte Ergebnisse lässt sich ein Sorted Set nutzen (rangähnlicher Zugriff mit ZADD/ZRANGE); relationale Fensteroperationen wie PARTITION BY/LAG erfolgen jedoch in der Anwendungsschicht.

Elasticsearch

# Not applicable: there are no SQL-like window functions.
# Closest equivalent: bucket aggregations.
GET sale/_search
{ "size": 0, "aggs": { "by_city": {
  "terms": { "field": "city" },
  "aggs": { "total": { "sum": { "field": "amount" } } } } } }

Elasticsearch bietet keine klassischen Fensterfunktionen (ROW_NUMBER/RANK/LAG). Gruppierung und Sortierung erfolgen über das Aggregation-Framework: Eine terms-Aggregation kommt PARTITION BY nahe, top_hits den Top-Datensätzen und derivative/serial_diff (Pipeline-Aggregationen) LAG-ähnlichen Differenzen aufeinanderfolgender Werte.

In DBAtlas öffnen →