0Pricing
SQL Interview Prep · Ders

GROUP BY Olmadan Grup Başına Toplulaştırma

Ayrıntı satırlarının yanında grup maksimumunu hesaplamak için ilişkili alt sorgu kullanın.

GROUP BY Olmadan Grup Başına Toplulaştırma, CoddyKit'te ücretsiz bir SQL Interview Prep dersidir. Bu, 4 dersinin 2. 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 Interview Prep öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. SQL Interview Prep kursu toplamda 4 dersten oluşur.

Ayrıntı ve Toplu Değer Sorunu

Sık sorulan bir mülakat sorusu şudur: "Her satırı, grubunun toplu değeriyle yan yana gösterin." Örneğin her çalışanı, departmanının en yüksek maaşıyla aynı satırda listeleyin.

Düz bir GROUP BY satırları birleştirerek tekilleştirir; bu nedenle çalışan ayrıntılarını koruyamaz. Ayrıntı satırlarını ve grup düzeyindeki bir sayıyı birlikte göstermeniz gerekir.

İlişkili bir alt sorgu bu sorunu zarif biçimde çözer: hiçbir satırı birleştirmeden her ayrıntı satırı için grup toplulaştırmasını hesaplar.

Düz GROUP BY Burada Neden Başarısız Olur

SELECT dept_id, MAX(salary) FROM employees GROUP BY dept_id yazarsanız departman başına bir satır elde eder ve kişilerin adlarını kaybedersiniz.

SELECT'e name ekleyip GROUP BY'a eklemezseniz klasik "sütun GROUP BY içinde yer almalıdır" hatası oluşur.

Mülakat yapan kişi, GROUP BY'ın satır sayısını azalttığını anlayıp anlamadığınızı denetler. Ayrıntı satırlarını korumak için toplu değeri başka bir şekilde hesaplamanız gerekir.

İmdada Yetişen İlişkili Alt Sorgu

Grup toplulaştırmasını SELECT listesine ilişkili bir alt sorgu olarak yerleştirin. Her çalışan satırı, o çalışanın departmanıyla sınırlandırılmış bir iç MAX hesaplamasını tetikler.

e2.dept_id = e1.dept_id ilişkilendirmesi toplu değeri doğru gruba bağlarken dış sorgu hâlâ çalışan başına bir satır döndürür.

SELECT e1.name,
       e1.dept_id,
       e1.salary,
       (SELECT MAX(e2.salary)
        FROM employees e2
        WHERE e2.dept_id = e1.dept_id) AS dept_max_salary
FROM employees e1;

Her Satırı Kendi Grubuyla Karşılaştırma

Grup toplu değeri sorguda yer aldıktan sonra her satırı bu değerle karşılaştırabilirsiniz. Sık sorulan bir soru şudur: "Departman ortalamasından daha fazla kazanan çalışanları bulun."

Burada ilişkili AVG WHERE içinde yer alır; böylece her çalışan kendi departmanının ortalamasına göre sınanır.

SELECT e1.name, e1.dept_id, e1.salary
FROM employees e1
WHERE e1.salary > (
    SELECT AVG(e2.salary)
    FROM employees e2
    WHERE e2.dept_id = e1.dept_id
);

Grupla Aradaki Farkı Hesaplama

Her satırın grup toplu değerinden ne kadar uzak olduğunu da gösterebilirsiniz. İlişkili ortalamayı çıkarmak, satır başına bir fark verir.

Aynı ilişkili alt sorgunun birden fazla SELECT ifadesinde yeniden kullanılabileceğine dikkat edin; motor, alt sorgu göründüğü her seferde onu satır başına değerlendirir.

SELECT e1.name,
       e1.salary,
       e1.salary - (SELECT AVG(e2.salary)
                    FROM employees e2
                    WHERE e2.dept_id = e1.dept_id) AS gap_from_dept_avg
FROM employees e1;

Grup Başına En Çok Kazananı Bulma

Departman başına yalnızca en yüksek maaşlı kişiyi döndürmek için her maaşı ilişkili MAX değeriyle karşılaştırın ve eşleşenleri tutun.

Bu kalıp eşit sonuçları da döndürür: iki çalışan departman maksimumunu paylaşıyorsa ikisi de görünür. Eşit sonuçların ele alınması, mülakat yapan kişinin sık sorduğu devam sorularındandır.

SELECT e1.name, e1.dept_id, e1.salary
FROM employees e1
WHERE e1.salary = (
    SELECT MAX(e2.salary)
    FROM employees e2
    WHERE e2.dept_id = e1.dept_id
);

Pencere İşlevi Seçeneği

Modern SQL daha temiz bir araç sunar: pencere işlevleri. MAX(salary) OVER (PARTITION BY dept_id), satırları birleştirmeden ve ilişkili yeniden tarama yapmadan grup toplu değerini hesaplar.

Mülakat yapanlar, iki çözümü de sunabildiğinizde ve pencere sürümünün genellikle daha iyi performans gösterdiğini, çünkü tabloyu yalnızca bir kez taradığını açıklayabildiğinizde bunu takdir eder.

SELECT name,
       dept_id,
       salary,
       MAX(salary) OVER (PARTITION BY dept_id) AS dept_max_salary
FROM employees;

İlişkili Alt Sorgu ve Pencere İşlevi Karşılaştırması

Her iki yaklaşım da aynı sonuç biçimini döndürür, ancak aralarında farklar vardır:

  • İlişkili alt sorgu: taşınabilirdir, çok eski motorlarda da çalışır; ancak her satır için yeniden değerlendirilir.
  • Pencere işlevi: tek geçişte çalışır, büyük tablolarda çok daha hızlıdır; SQL'in pencere desteğini gerektirir.

Hangisini seçeceğinizi ve nedenini söyleyin. Küçük bir tabloda tek seferlik kullanım için ikisi de uygundur; büyük ölçekli analizlerde pencere işlevini tercih edin.

Uygulamalı Örnek: Müşteri Ortalamasının Üzerindeki Siparişler

Bu kalıbı siparişlere uygulayın. Siparişi veren müşterinin kendi ortalama sipariş değerini aşan siparişleri gösterin.

İlişkili AVG, o2.customer_id = o1.customer_id ile sınırlandırılır ve her siparişe müşterisinin kişisel referans değerini verir.

SELECT o1.order_id, o1.customer_id, o1.amount
FROM orders o1
WHERE o1.amount > (
    SELECT AVG(o2.amount)
    FROM orders o2
    WHERE o2.customer_id = o1.customer_id
);

NULL ve Boş Grup Durumlarına Dikkat Edin

Bir grupta yalnızca bir satır varsa ortalaması o satıra eşit olur; bu nedenle salary > avg yanlıştır ve satır sonuçlardan çıkar. Bu uç durumu önceden belirtin.

NULL maaşlar AVG ve MAX tarafından yok sayılır; bu, SQL toplulaştırmalarının anlamına uygundur. Bir gruptaki tüm değerler NULL ise toplu değer NULL olur ve karşılaştırmalar UNKNOWN sonucunu verir; böylece satır sonuçlardan çıkar. Bu durumları önceden öngörmek, kapsamlı bir yanıt vermenizi sağlar.

Grup İçindeki Sıralamayı Sayma

Bir satırın grubu içindeki sırasını ilişkili COUNT ile ifade edebilirsiniz. Her çalışanın departmanı içindeki maaş sırasını bulmak için daha fazla kazanan kaç çalışma arkadaşı olduğunu sayın.

1. sıra, en yüksek maaşlı kişi demektir. 1 eklemek, daha fazla kazananların sayısını 1'den başlayan bir sıraya dönüştürür; ilişkilendirme de kapsamı departmanla sınırlar.

SELECT e1.name,
       e1.dept_id,
       e1.salary,
       (SELECT COUNT(*) + 1
        FROM employees e2
        WHERE e2.dept_id = e1.dept_id
          AND e2.salary > e1.salary) AS salary_rank_in_dept
FROM employees e1;

Hızlı Sınama

Bu görevde ilişkili bir alt sorgunun düz GROUP BY'dan neden daha iyi olduğunu seçin.

Özet: GROUP BY Olmadan Grup Toplulaştırmaları

Temel çıkarımlar:

  • İlişkili bir alt sorgu, satırları birleştirmeden her ayrıntı satırına grup düzeyinde bir toplu değer ekler.
  • Toplu değeri göstermek için SELECT içinde, her satırı grubuyla karşılaştırmak için WHERE içinde kullanın.
  • = MAX(...) kalıbı, eşit olan tüm en üst satırları döndürür.
  • PARTITION BY içeren bir pencere işlevi aynı işi tek geçişte yapar ve genellikle daha iyi ölçeklenir.

Mülakatta her iki çözümü de sunun ve seçiminizi gerekçelendirin.

Sıkça Sorulan Sorular

“GROUP BY Olmadan Grup Başına Toplulaştırma” dersi ücretsiz mi?

Evet — “GROUP BY Olmadan Grup Başına Toplulaştırma” 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 Interview Prep kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. SQL Interview Prep kursu toplamda 4 dersten oluşur.

“GROUP BY Olmadan Grup Başına Toplulaştırma” dersinde ne öğreneceğim?

Ayrıntı satırlarının yanında grup maksimumunu hesaplamak için ilişkili alt sorgu kullanın. SQL Interview Prep 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 Interview Prep öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te SQL Interview Prep, 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 2. dersidir.

“GROUP BY Olmadan Grup Başına Toplulaştırma” 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 Interview Prep dersinde kod yazıp çalıştırabilir miyim?

Evet. Her SQL Interview Prep 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

  1. İlişkili Alt Sorgunun Anatomisi
  2. GROUP BY Olmadan Grup Başına Toplulaştırma
  3. İlişkili EXISTS ve NOT EXISTS
  4. İlişkili Alt Sorguları Birleştirme Olarak Yeniden Yazma
← SQL Interview Prep Sayfasına Dön