SQL Academy · Ders

Analitik Sorgular Yazma

Ölçümleri dilimleyin, ayrıştırın ve toplulaştırın.

4. ders / 413 adım

Analitik Sorgular Yazma, CoddyKit'te ücretsiz bir SQL Academy dersidir. Bu, 4 dersinin 4. 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.

Analitik Sorgular Nedir?

Analitik sorgular, basit satır aramalarının ötesine geçer. 42 numaralı müşteri hangi siparişi verdi? diye sormak yerine, bölge ve çeyrek bazında toplam gelir nedir? veya bu ay geçen ayla nasıl karşılaştırılıyor? gibi sorular sorar.

Yıldız şeması üzerine kurulmuş bir veri ambarında analitik sorgular, iş içgörülerini ortaya çıkarmak için olguları dilimler (bir boyutu filtreler), küpler (birden çok boyutu filtreler) ve üst düzeyde toplar (daha genel bir ayrıntı düzeyinde toplar).

Yıldız Şemasını Hatırlama

Yıldız şemasında, fact_sales gibi merkezi bir olgu tablosu ile bu tabloyu çevreleyen dim_date, dim_product ve dim_store gibi boyut tabloları bulunur. Analitik sorgular, mevcut analiz için gereken boyutları olgu tablosuyla birleştirir.

SELECT
    s.store_name,
    d.year,
    d.quarter,
    SUM(f.revenue)   AS total_revenue,
    SUM(f.units_sold) AS total_units
FROM fact_sales f
JOIN dim_store  s ON s.store_id  = f.store_id
JOIN dim_date   d ON d.date_id   = f.date_id
GROUP BY
    s.store_name,
    d.year,
    d.quarter
ORDER BY
    d.year,
    d.quarter,
    s.store_name;

Dilimleme: Tek Boyutu Filtreleme

Dilimleme, sonuç kümesini tek bir boyutun tek bir değeriyle sınırlandırmak anlamına gelir — örneğin yalnızca 2024 yılına ait verilere bakmak. WHERE yan tümcesi dilimleme aracınızdır.

Erken dilimleme yaparak veritabanının toplaması gereken satır sayısını azaltırsınız; bu da büyük olgu tablolarında sorguların hızlı kalmasını sağlar.

-- Slice: only year 2024
SELECT
    p.category,
    SUM(f.revenue) AS total_revenue
FROM fact_sales f
JOIN dim_product p ON p.product_id = f.product_id
JOIN dim_date   d ON d.date_id    = f.date_id
WHERE d.year = 2024
GROUP BY p.category
ORDER BY total_revenue DESC;

Küpleme: Birden Çok Boyutu Filtreleme

Küpleme, aynı anda iki veya daha fazla boyuta filtre uygulamak anlamına gelir — örneğin Kuzey bölgesinde 1. çeyrekteki elektronik satışlarına bakmak. Eklenen her WHERE koşulu, daha küçük bir veri kümesi oluşturur.

-- Dice: category = 'Electronics', region = 'North', Q1
SELECT
    d.month,
    SUM(f.revenue)    AS revenue,
    SUM(f.units_sold) AS units
FROM fact_sales f
JOIN dim_product p ON p.product_id = f.product_id
JOIN dim_store   s ON s.store_id   = f.store_id
JOIN dim_date    d ON d.date_id    = f.date_id
WHERE
    p.category  = 'Electronics'
    AND s.region = 'North'
    AND d.year   = 2024
    AND d.quarter = 1
GROUP BY d.month
ORDER BY d.month;

Üst Düzeyde Toplama: Daha Genel Bir Ayrıntı Düzeyinde Birleştirme

Üst düzeyde toplama, ayrıntılı bir düzeyden (mağaza başına günlük satışlar) daha genel bir düzeye (bölge başına aylık satışlar) geçmek anlamına gelir. Bunu, alt düzeydeki GROUP BY sütunlarını kaldırıp verileri yeniden toplayarak yaparsınız.

ROLLUP değiştiricisi, birden çok UNION ALL bloğu yazmak yerine ara toplamları ve genel toplamları tek bir sorguda üretmenizi sağlar.

-- Roll up from store/month to region/quarter with subtotals
SELECT
    s.region,
    d.quarter,
    SUM(f.revenue) AS revenue
FROM fact_sales f
JOIN dim_store s ON s.store_id = f.store_id
JOIN dim_date  d ON d.date_id  = f.date_id
WHERE d.year = 2024
GROUP BY ROLLUP(s.region, d.quarter)
ORDER BY s.region NULLS LAST, d.quarter NULLS LAST;

LAG ile Dönemler Arası Karşılaştırmalar

En yaygın analitik örüntülerden biri, bir ölçüyü önceki dönemdeki aynı ölçüyle karşılaştırmaktır. Pencere işlevi olan LAG(), kendi kendisiyle birleştirme yapmadan önceki satırın değerini doğrudan geçerli satıra getirmenizi sağlar.

Burada aydan aya gelir artışını yüzde olarak hesaplıyoruz.

WITH monthly AS (
    SELECT
        d.year,
        d.month,
        SUM(f.revenue) AS revenue
    FROM fact_sales f
    JOIN dim_date d ON d.date_id = f.date_id
    GROUP BY d.year, d.month
)
SELECT
    year,
    month,
    revenue,
    LAG(revenue) OVER (ORDER BY year, month) AS prev_month_revenue,
    ROUND(
        100.0 * (revenue - LAG(revenue) OVER (ORDER BY year, month))
             / NULLIF(LAG(revenue) OVER (ORDER BY year, month), 0),
    2) AS mom_growth_pct
FROM monthly
ORDER BY year, month;

SUM OVER ile Birikimli Toplamlar

Birikimli toplam, belirli bir sıradaki her satırın değerini kendisinden önceki tüm satırların toplamına ekler. Bu yöntem, bir yıl içindeki birikimli geliri izlemek veya bütçenin tükenişini takip etmek için idealdir.

ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW çerçeve yan tümcesi, pencereyi açık ve belirsizliğe yer bırakmayacak şekilde tanımlar.

SELECT
    d.year,
    d.month,
    SUM(f.revenue)                                      AS monthly_revenue,
    SUM(SUM(f.revenue)) OVER (
        PARTITION BY d.year
        ORDER BY d.month
        ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
    )                                                   AS ytd_revenue
FROM fact_sales f
JOIN dim_date d ON d.date_id = f.date_id
GROUP BY d.year, d.month
ORDER BY d.year, d.month;

Boyutları DENSE_RANK ile Sıralama

Sıralama, bir grup içindeki en iyi veya en düşük performans gösterenleri bulmanızı sağlar. DENSE_RANK(), eşitlik durumunda aralık bırakmadan ardışık sıralar atar; bu nedenle BI raporlarındaki liderlik tabloları için tercih edilir.

Sıralanmış sonucu bir CTE içine alıp sıralamaya göre filtrelemek, ilk N örüntüsünü temiz ve okunabilir hâle getirir.

WITH ranked_products AS (
    SELECT
        p.product_name,
        p.category,
        SUM(f.revenue) AS revenue,
        DENSE_RANK() OVER (
            PARTITION BY p.category
            ORDER BY SUM(f.revenue) DESC
        ) AS rnk
    FROM fact_sales f
    JOIN dim_product p ON p.product_id = f.product_id
    JOIN dim_date   d ON d.date_id     = f.date_id
    WHERE d.year = 2024
    GROUP BY p.product_name, p.category
)
SELECT *
FROM ranked_products
WHERE rnk <= 3
ORDER BY category, rnk;

Pencere SUM'ı ile Katkı Yüzdesi

Bir ürünün mutlak gelirini bilmek yararlıdır; ancak kategori gelirinin %38'ine katkıda bulunduğunu bilmek daha eyleme geçirilebilir bir bilgidir. Tüm bölüm üzerinde kullanılan pencere SUM() işlevi, alt sorgu birleştirmesine gerek kalmadan paydayı sağlar.

SELECT
    p.category,
    p.product_name,
    SUM(f.revenue)                               AS product_revenue,
    SUM(SUM(f.revenue)) OVER (PARTITION BY p.category) AS category_revenue,
    ROUND(
        100.0 * SUM(f.revenue)
             / SUM(SUM(f.revenue)) OVER (PARTITION BY p.category),
    1)                                           AS pct_of_category
FROM fact_sales f
JOIN dim_product p ON p.product_id = f.product_id
JOIN dim_date   d ON d.date_id     = f.date_id
WHERE d.year = 2024
GROUP BY p.category, p.product_name
ORDER BY p.category, pct_of_category DESC;

Eğilim Yumuşatma için Hareketli Ortalamalar

Günlük veya haftalık satış rakamları gürültülüdür. Hareketli ortalama, kısa vadeli dalgalanmaları yumuşatarak temel eğilimi görmenizi sağlar. Burada, kayan bir pencere çerçevesi kullanılarak 3 aylık hareketli ortalama hesaplanır.

WITH monthly_rev AS (
    SELECT
        d.year,
        d.month,
        SUM(f.revenue) AS revenue
    FROM fact_sales f
    JOIN dim_date d ON d.date_id = f.date_id
    GROUP BY d.year, d.month
)
SELECT
    year,
    month,
    revenue,
    ROUND(
        AVG(revenue) OVER (
            ORDER BY year, month
            ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
        ),
    2) AS moving_avg_3m
FROM monthly_rev
ORDER BY year, month;

Tüm Boyut Birleşimleri için CUBE

CUBE, yalnızca hiyerarşik üst düzeyde toplama yolunu değil, listelenen boyutların mümkün olan her birleşimi için ara toplamları hesaplayarak ROLLUP'ı genişletir. Böylece boyutlar arasında serbestçe eksen değiştirebilen kullanıcıların bulunduğu çok boyutlu panolar için yararlı olan, boyutlar arası tam özet tek geçişte üretilir.

Bir gruplama sütunundaki NULL, o boyutun tüm değerleri anlamına gelir — verilerdeki kasıtlı NULL değerleri üst düzeyde toplama işleminden kaynaklanan NULL değerlerinden ayırt etmek için GROUPING() kullanın.

SELECT
    CASE WHEN GROUPING(s.region)   = 1 THEN 'ALL REGIONS'    ELSE s.region        END AS region,
    CASE WHEN GROUPING(p.category) = 1 THEN 'ALL CATEGORIES' ELSE p.category      END AS category,
    CASE WHEN GROUPING(d.quarter)  = 1 THEN 'ALL QUARTERS'   ELSE d.quarter::TEXT END AS quarter,
    SUM(f.revenue) AS revenue
FROM fact_sales f
JOIN dim_store   s ON s.store_id   = f.store_id
JOIN dim_product p ON p.product_id = f.product_id
JOIN dim_date    d ON d.date_id    = f.date_id
WHERE d.year = 2024
GROUP BY CUBE(s.region, p.category, d.quarter)
ORDER BY s.region NULLS LAST, p.category NULLS LAST, d.quarter NULLS LAST;

Sonuçları tek bir boyut değerine sınırlayan işlem hangisidir?

Veri ambarlarında kullanılan analitik sorgu terminolojisini anlayıp anlamadığınızı sınayın.

Özet: Analitik Sorgular Yazma

Bu derste yıldız şemasına yönelik analitik sorgular yazmak için kullanılan temel örüntüleri incelediniz:

  • Dilimleme — belirli bir bölüme odaklanmak için WHERE ile tek bir boyutu filtreleme.
  • Küpleme — kesin bir veri küpü oluşturmak için birden çok boyutu aynı anda filtreleme.
  • Üst düzeyde toplama — daha genel bir ayrıntı düzeyinde toplama; çok düzeyli ara toplamlar için ROLLUP veya CUBE kullanma.
  • LAG / LEAD — kendi kendine birleştirme yapmadan dönemler arası karşılaştırmalar.
  • Birikimli toplamlar & hareketli ortalamalar — pencere çerçeveleri aracılığıyla kümülatif ve yumuşatılmış ölçümler.
  • DENSE_RANK — bölümler içindeki temiz ilk N sıralamaları.
  • Katkı % — pay hesaplamalarında payda olarak pencere SUM'ı.

Bu örüntüleri birleştirmek, üretim veri ambarlarında karşılaşacağınız BI ve raporlama gereksinimlerinin büyük çoğunluğunu karşılar.

Başlamak ücretsiz

Yapay zeka eğitmeniyle SQL öğren — ücretsiz

Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.

Kurslar
46
Dersler
183

Sıkça Sorulan Sorular

“Analitik Sorgular Yazma” dersi ücretsiz mi?

Evet — “Analitik Sorgular Yazma” 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.

“Analitik Sorgular Yazma” dersinde ne öğreneceğim?

Ölçümleri dilimleyin, ayrıştırın ve toplulaştırın. 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 4. dersidir.

“Analitik Sorgular Yazma” 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

  1. OLTP ve OLAP Karşılaştırması
  2. Olgu ve Boyut Tabloları
  3. Yıldız ve Kar Tanesi Şemaları
  4. Analitik Sorgular Yazma
← SQL Academy Sayfasına Dön