DBAtlas · Veritabanı operasyon atlası

Pencere fonksiyonları (ROW_NUMBER/RANK/LAG)

Oracle

-- Her il içinde satışa göre sırala ve önceki değeri getir:
SELECT il, ad, tutar,
  ROW_NUMBER() OVER (PARTITION BY il ORDER BY tutar DESC) AS sira,
  RANK()       OVER (PARTITION BY il ORDER BY tutar DESC) AS rutbe,
  LAG(tutar)   OVER (PARTITION BY il ORDER BY tarih)      AS onceki
FROM satis;

Oracle analitik (pencere) fonksiyonlarının öncüsüdür; ROW_NUMBER, RANK, DENSE_RANK, LAG, LEAD, SUM/AVG OVER, NTILE, FIRST_VALUE tam desteklenir. OVER içinde PARTITION BY grupları, ORDER BY sıralamayı, çerçeve (ROWS/RANGE BETWEEN) kayan pencereyi tanımlar.

PostgreSQL

-- OVER() ile pencere fonksiyonları:
SELECT il, ad, tutar,
  ROW_NUMBER() OVER (PARTITION BY il ORDER BY tutar DESC) AS sira,
  RANK()       OVER (PARTITION BY il ORDER BY tutar DESC) AS rutbe,
  LAG(tutar)   OVER (PARTITION BY il ORDER BY tarih)      AS onceki
FROM satis;

PostgreSQL pencere fonksiyonlarını standart SQL söz dizimiyle tam destekler. ROW_NUMBER/RANK/DENSE_RANK, LAG/LEAD, toplama OVER, NTILE, FIRST_VALUE/LAST_VALUE kullanılabilir. Tekrar eden pencere tanımları WINDOW yan tümcesiyle adlandırılıp paylaşılabilir.

MySQL

-- MySQL 8.0+ pencere fonksiyonları:
SELECT il, ad, tutar,
  ROW_NUMBER() OVER (PARTITION BY il ORDER BY tutar DESC) AS sira,
  RANK()       OVER (PARTITION BY il ORDER BY tutar DESC) AS rutbe,
  LAG(tutar)   OVER (PARTITION BY il ORDER BY tarih)      AS onceki
FROM satis;

MySQL pencere fonksiyonlarını 8.0 sürümüyle ekledi (MariaDB 10.2+ da destekler). ROW_NUMBER, RANK, DENSE_RANK, LAG, LEAD, NTILE ve toplama OVER kullanılabilir. 8.0 öncesi sürümlerde bu fonksiyonlar yoktur; kullanıcı değişkenleriyle taklit edilirdi.

SQL Server

-- OVER() ile pencere fonksiyonları:
SELECT il, ad, tutar,
  ROW_NUMBER() OVER (PARTITION BY il ORDER BY tutar DESC) AS sira,
  RANK()       OVER (PARTITION BY il ORDER BY tutar DESC) AS rutbe,
  LAG(tutar)   OVER (PARTITION BY il ORDER BY tarih)      AS onceki
FROM dbo.satis;

SQL Server pencere fonksiyonlarını 2005'ten (ROW_NUMBER/RANK) ve 2012'den (LAG/LEAD, çerçeve, toplama OVER) itibaren destekler. PARTITION BY, ORDER BY ve ROWS/RANGE çerçevesi tam kullanılabilir. Sayfalama için OFFSET/FETCH veya ROW_NUMBER yaygındır.

MongoDB

// $setWindowFields ile pencere hesaplamaları:
db.satis.aggregate([
  { $setWindowFields: {
      partitionBy: "$il",
      sortBy: { tutar: -1 },
      output: {
        sira: { $documentNumber: {} },
        rutbe: { $rank: {} },
        onceki: { $shift: { output: "$tutar", by: -1 } }
      }
  } }
])

MongoDB 5.0 ile gelen $setWindowFields aggregation aşaması pencere fonksiyonlarını sağlar: $documentNumber (ROW_NUMBER), $rank/$denseRank, $shift (LAG/LEAD), toplama fonksiyonları ve kayan pencere (window: { documents/range }). partitionBy ve sortBy SQL'deki PARTITION/ORDER BY karşılığıdır.

Redis

# Uygulanamaz: SQL benzeri pencere fonksiyonu yoktur.

Redis anahtar-değer deposudur; analitik pencere fonksiyonları içermez. Sıralı sonuçlar için Sorted Set (ZADD/ZRANGE ile sıra ve rütbe benzeri erişim) kullanılabilir; ancak PARTITION BY/LAG gibi ilişkisel pencere işlemleri uygulama katmanında yapılır.

Elasticsearch

# Uygulanamaz: SQL benzeri pencere fonksiyonu yoktur.
# En yakın karşılık: koleksiyon toplama (aggregation).
GET satis/_search
{ "size": 0, "aggs": { "il_bazli": {
  "terms": { "field": "il" },
  "aggs": { "toplam": { "sum": { "field": "tutar" } } } } } }

Elasticsearch klasik pencere fonksiyonları (ROW_NUMBER/RANK/LAG) sunmaz. Gruplama ve sıralama aggregation çerçevesiyle yapılır: terms toplaması PARTITION BY'a, top_hits en iyi kayıtlara, derivative/serial_diff (pipeline aggregation) ise LAG benzeri ardışık fark hesabına yakındır.

DBAtlas'ta aç →