Menu
Coddy logo textTech

Anahtar Başına Tek Satır Tutma

Coddy'nin SQL Journey'sinin Temellerin Ötesi bölümünün bir parçası — ders 26 / 27.

Sıklıkla bir anahtarın (bir müşteri, bir sensör, bir ürün) birden fazla kez göründüğü bir tablonuz olur ve sadece en güncel olanı veya en yüksek puana sahip olanı tutmak istersiniz.

ROW_NUMBER() fonksiyonunu top-N için yaptığınız gibi kullanın, ardından rn = 1 olanları tutun.

WITH ranked AS (
    SELECT *,
           ROW_NUMBER() OVER (
               PARTITION BY customer_id ORDER BY purchased_at DESC
           ) AS rn
    FROM purchases
)
SELECT * FROM ranked WHERE rn = 1

PARTITION BY ifadesi "*bu* anahtar başına bir sıralama" der; ORDER BY ifadesi "en yeni olan en başta" der. Her bölümdeki 1. satır, tutmak istediğiniz satırdır.

challenge icon

Görev

Orta

Mevcut tablolar ve sütunlar:

  • <strong>readings</strong>: <strong>sensor_id</strong>, <strong>recorded_at</strong>, <strong>value</strong>

En az 3 okumaya sahip her bir sensör için, tek bir en yüksek değerli okumasını döndürün. Eğer iki okuma value üzerinde eşitse, daha güncel olanı tutun.

sensor_id, recorded_at, value sütunlarını sensor_id değerine göre sıralı olarak çıktı verin.

Kopya kağıdı

Her anahtar için yalnızca en son (veya en iyi) satırı tutmak için ROW_NUMBER() işlevini PARTITION BY ile kullanın, ardından rn = 1 şeklinde filtreleyin:

WITH ranked AS (
    SELECT *,
           ROW_NUMBER() OVER (
               PARTITION BY customer_id ORDER BY purchased_at DESC
           ) AS rn
    FROM purchases
)
SELECT * FROM ranked WHERE rn = 1
  • PARTITION BY — her benzersiz anahtar için sıralamayı sıfırlar
  • ORDER BY ... DESC — istenen satırı ilk sıraya koyar (en yeni, en yüksek, vb.)
  • WHERE rn = 1 — her bölüm için yalnızca o en üstteki satırı tutar

Kendin dene

WITH ranked AS (
    -- ROW_NUMBER() OVER (PARTITION BY sensor_id ORDER BY value DESC, recorded_at DESC)
    -- COUNT(*) OVER (PARTITION BY sensor_id) 3 veya daha fazla okumaya sahip sensörleri filtrelemek için
)
SELECT sensor_id, recorded_at, value
FROM ranked
WHERE rn = 1 AND total_readings >= 3
ORDER BY sensor_id
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Temellerin Ötesi bölümündeki tüm dersler