PostgreSQL DISTINCT ON
Her grup için bir satır seçin.
PostgreSQL DISTINCT ON, CoddyKit'te ücretsiz bir SQL Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, SQL Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. SQL Academy kursu toplamda 4 dersten oluşur.
DISTINCT ON Nedir?
PostgreSQL, standart DISTINCT anahtar sözcüğüne DISTINCT ON adı verilen güçlü bir genişletme sunar. Normal DISTINCT tamamen yinelenen satırları kaldırırken, DISTINCT ON seçtiğiniz bir veya daha fazla sütuna göre tam olarak her grup için bir satır seçmenizi sağlar.
Şöyle düşünebilirsiniz: 'Bu sütundaki her benzersiz değer için bana bir satır ver.' Bu özellik, müşteri başına en son siparişi, öğrenci başına en yüksek puanı veya kategori başına ilk olayı istediğinizde son derece kullanışlıdır.
Temel DISTINCT ON Sözdizimi
Sözdiziminde DISTINCT ON (column), SELECT ifadesinin hemen sonrasında yer alır. Parantezlerin içindeki sütun gruplamayı tanımlar — PostgreSQL bu sütunun her benzersiz değeri için bir satır döndürür.
Aşağıdaki örnek, bir siparişler tablosundan her customer_id için bir satır döndürür. PostgreSQL'in hangi satırı döndüreceğini, ardından gelen ORDER BY yan tümcesi belirler.
SELECT DISTINCT ON (customer_id)
customer_id,
order_id,
order_date,
total_amount
FROM orders
ORDER BY customer_id, order_date DESC;Örnek Tabloları Oluşturma
Basit bir orders tablosu oluşturalım ve DISTINCT ON ifadesini uygulamalı olarak deneyebilmek için bazı örnek satırlar ekleyelim. Her birinin farklı tarihlerde birden çok siparişi olan üç müşterimiz var.
CREATE TABLE orders (
order_id SERIAL PRIMARY KEY,
customer_id INT,
order_date DATE,
total_amount NUMERIC(10, 2)
);
INSERT INTO orders (customer_id, order_date, total_amount) VALUES
(1, '2024-01-05', 120.00),
(1, '2024-03-12', 85.50),
(1, '2024-06-20', 200.00),
(2, '2024-02-14', 45.00),
(2, '2024-05-30', 310.00),
(3, '2024-04-01', 75.00);Müşteri Başına En Son Sipariş
Çok yaygın bir kullanım örneği, her müşteri için en güncel siparişi bulmaktır. Her customer_id grubu içinde order_date DESC sıralaması yapıldığında DISTINCT ON, tarihi en yeni olan satırı seçer.
ORDER BY yan tümcesinin, DISTINCT ON içinde listelenen aynı sütun(lar)la başlaması gerektiğine dikkat edin. Bu bir PostgreSQL gereksinimidir.
SELECT DISTINCT ON (customer_id)
customer_id,
order_id,
order_date,
total_amount
FROM orders
ORDER BY customer_id, order_date DESC;Müşteri Başına En Eski Sipariş
Bunun yerine müşteri başına ilk (en eski) siparişi almak için sıralama yönünü ASC olarak değiştirmeniz yeterlidir. Tek fark, her gruptaki satırların sırasıdır — DISTINCT ON sıralamadan sonraki ilk satırı her zaman seçer.
SELECT DISTINCT ON (customer_id)
customer_id,
order_id,
order_date,
total_amount
FROM orders
ORDER BY customer_id, order_date ASC;ORDER BY Kuralı
Önemli kural: DISTINCT ON (col) kullanırken ORDER BY yan tümcesi, DISTINCT ON içinde listelenen aynı sütun(lar)la başlamalıdır. Başlamazsa PostgreSQL bir hata oluşturur.
Gruplama sütun(lar)ından sonra, her grupta hangi satırın seçileceğini denetlemek için istediğiniz ek sıralama ölçütlerini ekleyebilirsiniz.
-- Correct: ORDER BY starts with the DISTINCT ON column
SELECT DISTINCT ON (customer_id)
customer_id, order_date, total_amount
FROM orders
ORDER BY customer_id, total_amount DESC;
-- This would cause an error:
-- ORDER BY order_date DESC (missing customer_id at the start)Öğrenci Başına En Yüksek Puan
Burada test_scores tablosunu kullanan başka bir uygulamalı örnek yer alıyor. Her öğrencinin şimdiye kadar aldığı en yüksek puanı bulmak istiyoruz. Her öğrenci grubu içinde score DESC sıralaması yapıldığında DISTINCT ON, öğrenci başına yalnızca en yüksek puanlı satırı döndürür.
CREATE TABLE test_scores (
id SERIAL PRIMARY KEY,
student_id INT,
subject VARCHAR(50),
score INT,
taken_on DATE
);
INSERT INTO test_scores (student_id, subject, score, taken_on) VALUES
(101, 'Math', 92, '2024-02-10'),
(101, 'Math', 78, '2024-04-15'),
(102, 'Math', 85, '2024-02-10'),
(102, 'Math', 91, '2024-04-15'),
(103, 'Math', 67, '2024-02-10');
SELECT DISTINCT ON (student_id)
student_id, subject, score, taken_on
FROM test_scores
ORDER BY student_id, score DESC;Birden Çok Sütunla DISTINCT ON
DISTINCT ON içine birden çok sütun listeleyerek birden fazla sütuna göre gruplandırabilirsiniz. Bu, söz konusu sütunların her benzersiz birleşimi için bir satır döndürür.
Aşağıdaki örnek, öğrenci başına ve ders başına en yüksek puanı seçer; her (öğrenci, ders) çifti kendi grubu olarak ele alınır.
INSERT INTO test_scores (student_id, subject, score, taken_on) VALUES
(101, 'Science', 88, '2024-03-01'),
(101, 'Science', 95, '2024-05-20'),
(102, 'Science', 72, '2024-03-01');
SELECT DISTINCT ON (student_id, subject)
student_id, subject, score, taken_on
FROM test_scores
ORDER BY student_id, subject, score DESC;WHERE ile Filtreleme
DISTINCT ON, WHERE yan tümceleriyle birlikte doğal biçimde çalışır. Filtre önce uygulanır, ardından DISTINCT ON filtrelenmiş sonuçlardan her grup için bir satır seçer.
Burada müşteri başına en güncel siparişi buluyoruz, ancak yalnızca 100'den büyük siparişler için.
SELECT DISTINCT ON (customer_id)
customer_id,
order_id,
order_date,
total_amount
FROM orders
WHERE total_amount > 100
ORDER BY customer_id, order_date DESC;DISTINCT ON ve GROUP BY Karşılaştırması
Hem DISTINCT ON hem de GROUP BY grup başına bir satır üretebilir, ancak farklı amaçlara hizmet ederler:
- GROUP BY satırları tek bir grupta birleştirir ve gruplandırılmamış sütunlar için toplama işlevleri (SUM, MAX vb.) gerektirir.
- DISTINCT ON gerçekte var olan bir satırı korur — toplulaştırma yapmadan tüm sütunlarına erişilebilir.
Toplulaştırılmış değerlere ihtiyaç duyduğunuzda GROUP BY kullanın. Her grup içindeki belirli bir satırın tüm verilerine ihtiyaç duyduğunuzda DISTINCT ON kullanın.
-- GROUP BY: only aggregated columns allowed
SELECT customer_id, MAX(order_date) AS latest_date
FROM orders
GROUP BY customer_id;
-- DISTINCT ON: returns the whole row for that latest date
SELECT DISTINCT ON (customer_id)
customer_id, order_id, order_date, total_amount
FROM orders
ORDER BY customer_id, order_date DESC;Alt Sorguda DISTINCT ON Kullanımı
Bazen DISTINCT ON sonucunun üzerine ek filtreleme veya sıralama uygulamanız gerekir. Dıştaki ORDER BY gruplama sütununa bağlı olduğundan, son çıktıya farklı bir sıralama uygulamak için sorguyu bir alt sorguya (veya CTE'ye) sarabilirsiniz.
Bu örnek önce müşteri başına en son siparişi seçer, ardından son sonucu total_amount sütununa göre azalan sırada sıralar.
SELECT *
FROM (
SELECT DISTINCT ON (customer_id)
customer_id,
order_id,
order_date,
total_amount
FROM orders
ORDER BY customer_id, order_date DESC
) AS latest_orders
ORDER BY total_amount DESC;Kısa Kontrol
DISTINCT ON hakkındaki anlayışınızı kontrol edelim. Aşağıdaki sorguyu dikkatlice okuyun ve döndürdüğü sonucu en iyi açıklayan yanıtı seçin.
SELECT DISTINCT ON (department_id) department_id, employee_name, salary FROM employees ORDER BY department_id, salary DESC;
Ders Özeti
Harika çalıştınız! PostgreSQL DISTINCT ON hakkında öğrendiklerinizin özeti:
DISTINCT ON (col), belirtilen sütun(ların) her benzersiz değeri için tam olarak bir satır döndürür.ORDER BYyan tümcesi,DISTINCT ONiçinde listelenen aynı sütun(lar)la başlamalıdır — her gruptan hangi satırın seçileceğini bu belirler.- Birden çok sütun kullanabilirsiniz:
DISTINCT ON (col1, col2), her ikisinin birleşimine göre gruplandırır. GROUP BY'dan farklı olarakDISTINCT ON, tüm özgün sütunlarını içeren gerçek bir satır döndürür — toplulaştırma gerekmez.- Son çıktıyı farklı bir sütuna göre sıralamanız gerektiğinde sorguyu bir alt sorgunun içine sarın.
DISTINCT ON, PostgreSQL'e özgü bir özelliktir ve 'grup başına bir satır seçme' sorunlarını çözmenin en zarif yollarından biridir.
Sıkça Sorulan Sorular
“PostgreSQL DISTINCT ON” dersi ücretsiz mi?
Evet — “PostgreSQL DISTINCT ON” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve SQL Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. SQL Academy kursu toplamda 4 dersten oluşur.
“PostgreSQL DISTINCT ON” dersinde ne öğreneceğim?
Her grup için bir satır seçin. SQL Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
SQL Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te SQL Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“PostgreSQL DISTINCT ON” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu SQL Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her SQL Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- SELECT DISTINCT Temelleri
- Birden Çok Sütunda DISTINCT
- PostgreSQL DISTINCT ON
- Benzersiz Değerleri Sayma