Zephyrnet Logosu

DENSE_RANK()'ı Parçalamak: SQL Meraklıları için Adım Adım Kılavuz – KDnuggets

Tarih:

DENSE_RANK()'ı Parçalamak: SQL Meraklıları için Adım Adım Kılavuz
Editöre göre resim
 

Günümüzün veri odaklı dünyasında SQL (Yapılandırılmış Sorgu Dili), veritabanı sistemlerini yönetmek ve değiştirmek için bir temel taşı olarak duruyor. SQL'in gücünün ve esnekliğinin temel bileşeni, pencere fonksiyonları, geçerli satırla ilgili satır kümeleri arasında hesaplamalar gerçekleştiren işlevler kategorisi.

Verilerinize kayan bir pencereden baktığınızı ve bu pencerenin konumuna ve boyutuna göre verileriniz üzerinde hesaplamalar veya dönüşümler yaptığınızı hayal edin. Temelde SQL pencere fonksiyonlarının yaptığı budur. Standart SQL komutları kullanılarak gerçekleştirilmesi zor olan toplamların, ortalamaların veya sıralamaların hesaplanması gibi görevleri yerine getirirler.

Pencere işlevleri araç kutusundaki en sağlam araçlardan biri sıralama işlevidir, özellikle de DENSE_RANK() işlev. Bu işlev, veri analistleri için bir nimettir ve farklı veri satırlarını herhangi bir boşluk olmadan sıralamamıza olanak tanır. İster satış rakamlarına, ister web sitesi trafik verilerine, hatta basit bir öğrenci sınav puanları listesine dalın, DENSE_RANK() kaçınılmaz.

Bu yazıda, iç işleyişini derinlemesine inceleyeceğiz. DENSE_RANK()yakın kardeşleriyle yan yana getirerek RANK() ve ROW_NUMBER()ve SQL yolculuğunuzda sizi yanıltabilecek yaygın tuzaklardan nasıl kaçınabileceğinizi gösteriyor. Veri analizi becerilerinizi geliştirmeye hazır mısınız? Hadi dalalım.

SQL'deki sıralama işlevleri, bir sonuç kümesindeki her satıra benzersiz bir sıralama atayan pencere işlevlerinin bir alt kümesidir. Bu sıra değerleri, işlev içindeki ORDER BY yan tümcesi tarafından belirlenen belirli bir sıraya karşılık gelir. Sıralama işlevleri SQL'in temel dayanağıdır ve en iyi satış elemanını bulmak, en iyi performans gösteren web sayfasını belirlemek veya belirli bir yıl için en yüksek hasılat yapan filmi belirlemek gibi çeşitli görevler için veri analizinde yaygın olarak kullanılır.

SQL'de üç temel sıralama fonksiyonu vardır; RANK(), ROW_NUMBER(), ve DENSE_RANK(). Bu işlevlerin her biri biraz farklı çalışır ancak hepsi, verileri belirli koşullara göre sıralamak gibi ortak bir amaca hizmet eder. RANK() ve DENSE_RANK() işlevler, aynı değerlere sahip satırlara aynı dereceyi atamaları bakımından benzer davranışa sahiptir. En önemli fark, sonraki sıralamayı nasıl ele aldıklarında yatmaktadır. RANK() bir sonraki sırayı atlarken DENSE_RANK() değil.

Öte yandan, ROW_NUMBER() işlevi, sütun değerlerine göre sıralamanın aynı olup olmadığına bakılmaksızın her satıra benzersiz bir satır numarası atar. Sırasında RANK(), DENSE_RANK(), ve ROW_NUMBER() İlk bakışta birbirinin yerine kullanılabilir gibi görünse de, aralarındaki nüansları anlamak, SQL'de etkili veri analizi açısından çok önemlidir. Bu işlevler arasındaki seçim, sonuçlarınızı ve verilerinizden elde edilen öngörüleri önemli ölçüde etkileyebilir.

DENSE_RANK() SQL'de belirli bir bölüme benzersiz bir sıralama değeri atayan güçlü bir sıralama işlevidir. İşin özünde, DENSE_RANK() verileriniz için boşluksuz sıralamalar verir; bu, her benzersiz değere ayrı bir sıralama verildiği ve aynı değerlerin aynı sıralamayı aldığı anlamına gelir. Benzerlerinden farklı olarak RANK(), DENSE_RANK() Değerler arasında eşitlik olması durumunda herhangi bir sıra atlamaz.

Bunu ayrıntılı olarak açıklamak gerekirse, öğrenci puanlarından oluşan bir veri kümenizin olduğu ve üç öğrencinin aynı puanı, örneğin 85 puanı aldığı bir senaryoyu gözümüzde canlandıralım. Kullanma RANK(), üç öğrenci de 1'inci sırayı alacak, ancak bir sonraki en iyi puan 4 ve 2'üncü sıralar atlanarak 3'üncü sırada yer alacak. Ancak, DENSE_RANK() bunu farklı şekilde ele alıyor. Her üç öğrenciye de 1'lik bir sıralama verilecek ve bir sonraki en iyi puana 2'lik bir sıralama verilecek ve sıralamada boşluk olmaması sağlanacak.

Peki ne zaman kullanılmalı DENSE_RANK()? Herhangi bir boşluk olmadan sürekli sıralamaya ihtiyaç duyduğunuz senaryolarda özellikle kullanışlıdır. En iyi üç performansı ödüllendirmeniz gereken bir kullanım senaryosunu düşünün. Verilerinizde bağlarınız varsa, şunu kullanın: RANK() hak eden bir adayı ödüllendirme fırsatını kaçırmanıza neden olabilir. işte o zaman DENSE_RANK() kurtarmaya geliyor, tüm en yüksek puanlı oyuncuların gereken takdiri almasını ve rütbelerin atlanmamasını sağlıyor.

arasındaki farkları anlamak DENSE_RANK(), RANK(), ve ROW_NUMBER() SQL'de verimli veri analizi için gereklidir. Her üç işlev de kendi alanlarında güçlüdür ancak aralarındaki ince farklar, veri analizinizin sonucunu önemli ölçüde etkileyebilir.

İle başlayalım RANK(). Bu işlev, bir veri kümesi içindeki her farklı değere benzersiz bir sıralama atar ve aynı sıralama aynı değerlere atanır. Ancak ne zaman RANK() bir eşitlikle (aynı değerler) karşılaştığında, sıradaki sonraki sırayı/sıraları atlar. Örneğin satış rakamları aynı olan üç ürününüz varsa, RANK() bu ürünlerin her birine aynı dereceyi atayacak ancak daha sonra bir sonraki sırayı atlayacaktır. Bu, eğer bu üç ürün en çok satan ürünlerse hepsine 1. sıra atanacak, ancak bir sonraki en çok satan ürüne 4. değil 2. sıra atanacak.

Sonra düşünelim DENSE_RANK(). Benzer RANK(), DENSE_RANK() Aynı değerleri aynı değerlere atar ancak herhangi bir sıralamayı atlamaz. Önceki örneği kullanarak, DENSE_RANK(), en çok satan üç ürüne hâlâ 1. sıra atanacak, ancak bir sonraki en çok satan ürüne 2. sıra değil 4. sıra atanacak.

En sonunda, ROW_NUMBER() farklı bir yaklaşım benimsiyor. Değerlerin aynı olup olmadığına bakılmaksızın her satıra benzersiz bir sıralama atar. Bu, üç ürünün satış rakamları aynı olsa bile, ROW_NUMBER() her birine benzersiz bir numara atayacaktır; bu, onu her satıra ayrı bir tanımlayıcı atamanız gereken durumlar için mükemmel hale getirir.

Sözdizimi DENSE_RANK() basittir. İle birlikte kullanılır OVER() madde, sıralamaları atamadan önce verileri bölümlendiriyor. Sözdizimi aşağıdaki gibidir: DENSE_RANK() OVER (ORDER BY column). İşte, column verilerinizi sıralamak istediğiniz sütunu ifade eder. Adlı bir tablomuzun olduğu bir örneği ele alalım. Sales sütunlu SalesPerson ve SalesFigures. Satış görevlilerini satış rakamlarına göre sıralamak için şu formülü kullanırız: DENSE_RANK() aşağıdaki gibi işlev: DENSE_RANK() OVER (ORDER BY SalesFigures DESC). Bu SQL sorgusu satış elemanlarını satış rakamlarına göre en yüksekten en düşüğe doğru sıralayacaktır.

kullanma DENSE_RANK() ile birlikte PARTITION BY özellikle anlayışlı olabilir. Örneğin, her bölgedeki satış görevlilerini sıralamak istiyorsanız verilerinizi şu şekilde bölümlendirebilirsiniz: Region ve ardından her bölüm içinde sıralama yapın. Bunun sözdizimi şöyle olacaktır: DENSE_RANK() OVER (PARTITION BY Region ORDER BY SalesFigures DESC). Bu şekilde, yalnızca kapsamlı bir sıralama elde etmekle kalmaz, aynı zamanda her bölgedeki performansa ilişkin incelikli bir anlayışa da sahip olursunuz.

Apple SQL Sorusu: Her Satış Tarihinde En İyi Satış Performansı Gösterenleri Bulun

Tablo: satış_verileri

+------------+-----------+------------+
|employee_id | sales_date| total_sales|
+------------+-----------+------------+
|101         |2024-01-01 |500         |
|102         |2024-01-01 |700         |
|103         |2024-01-01 |600         |
|101         |2024-01-02 |800         |
|102         |2024-01-02 |750         |
|103         |2024-01-02 |900         |
|101         |2024-01-03 |600         |
|102         |2024-01-03 |850         |
|103         |2024-01-03 |700         |
+------------+-----------+------------+

 

Çıktı

+------------+-----------+------------+
|employee_id | sales_date| total_sales|
+------------+-----------+------------+
|101         |2024-01-01 |800         |
|103         |2024-01-02 |900         |
|102         |2024-01-03 |850         |
+------------+-----------+------------+

Apple En İyi Satış Performansına Sahip Çözüm

1. Adım: Verileri Anlayın

Öncelikle sales_data tablosundaki verileri anlayalım. Üç sütunu vardır: çalışan_kimliği, satış_tarihi ve toplam_satışlar. Bu tablo, çalışana ilişkin bilgileri, satış tarihini ve toplam satış tutarını içeren satış verilerini temsil eder.

Adım 2: DENSE_RANK() İşlevini Analiz Edin

Sorgu, çalışanları her satış tarihi bölümündeki toplam satışlarına göre sıralamak için DENSE_RANK() pencere işlevini kullanır. DENSE_RANK(), satış_tarihi bölümündeki her satıra, azalan sırada total_sales'e dayalı sıralamayla bir sıralama atamak için kullanılır.

3. Adım: Sorgu Yapısını Parçalayın

Şimdi sorgunun yapısını inceleyelim:

SELECT 
  employee_id, 
  sales_date, 
  total_sales 
FROM 
  (
    SELECT 
      employee_id, 
      sales_date, 
      total_sales, 
      DENSE_RANK() OVER (
        PARTITION BY sales_date 
        ORDER BY 
          total_sales DESC
      ) AS sales_rank 
    FROM 
      sales_data
  ) ranked_sales 
WHERE 
  sales_rank = 1;

 

  • SELECT Clause: Nihai sonuca dahil edilecek sütunları belirtir. Bu durumda, çalışan_kimliği, satış_tarihi ve toplam_satış'tır.
  • FROM Cümlesi: Gerçek verilerin geldiği yer burasıdır. Sales_data tablosundan sütunları seçen ve DENSE_RANK() kullanarak hesaplanmış bir sütun ekleyen bir alt sorgu (parantez içinde) içerir.
  • DENSE_RANK() Fonksiyonu: Bu fonksiyon, alt sorgu içerisinde total_sales sütununa göre her satıra bir sıralama atamak için kullanılır ve sales_date'e göre bölümlenir. Bu, sıralamanın her satış tarihi için ayrı ayrı yapıldığı anlamına gelir.
  • WHERE Maddesi: Bu, sonuçları yalnızca sales_rank'ın 1'e eşit olduğu satırları içerecek şekilde filtreler. Bu, her satış tarihinde yalnızca en yüksek satış performansını sergileyen kişinin nihai sonuca dahil edilmesini sağlar.

4. Adım: Sorguyu Çalıştırın

Bu sorguyu çalıştırdığınızda, her satış tarihinde en iyi satış performansını sergileyen kişinin çalışan_kimliği, satış_tarihi ve toplam_satış bilgilerini içeren bir sonuç kümesi oluşturulur.

Adım 5: Çıktıyı Gözden Geçirin

top_performers adlı son çıktı tablosu istenen bilgileri içerecektir: DENSE_RANK() hesaplamasına dayalı olarak her satış tarihi için en iyi satış performansını sergileyen kişi

Google SQL Sorusu: Her Ürün İçin En Yüksek İnceleme Puanını Sağlayan Müşteriyi Bulun

Tablo: ürün_incelemeleri

+------------+-----------+-------------+-------------------------------+
|customer_id | product_id| review_date | review_score | helpful_votes  |
+------------+-----------+-------------+--------------+----------------+
|301         |101        |2024-04-01   |4.5           | 12             |
|302         |102        |2024-04-01   |3.8           | 8              |
|303         |103        |2024-04-01   |4.2           | 10             |
|301         |101        |2024-04-02   |4.8           | 15             |
|302         |102        |2024-04-02   |3.5           | 7              |
|303         |103        |2024-04-02   |4.0           | 11             |
|301         |101        |2024-04-03   |4.2           | 13             |
|302         |102        |2024-04-03   |4.0           | 10             |
|303         |103        |2024-04-03   |4.5           | 14             |
+------------+-----------+-------------+--------------+----------------+

 

Çıktı

+------------+-----------+-------------+--------------+----------------+
|customer_id | product_id| review_date | review_score | helpful_votes  |
+------------+-----------+-------------+--------------+----------------+
|301         |101        |2024-04-01   |4.5           | 12             |
|301         |101        |2024-04-02   |4.8           | 15             |
|303         |103        |2024-04-03   |4.5           | 14             |
+------------+-----------+-------------+--------------+----------------+

Google En Yüksek İnceleme Puanı Çözümü

1. Adım: Verileri Anlayın

Product_reviews tablosu, çeşitli ürünlere ilişkin müşteri incelemeleri hakkında bilgi içerir. Müşteri_kimliği, ürün_kimliği, inceleme_tarihi, inceleme_skoru ve yararlı_votes gibi sütunları içerir. Bu tablo, müşteri, incelenen ürün, inceleme tarihi, inceleme puanı ve alınan faydalı oyların sayısı hakkındaki ayrıntılarla birlikte müşteri incelemeleriyle ilgili verileri temsil eder.

Adım 2: DENSE_RANK() İşlevini Analiz Edin

Bu sorguda, ürün_kimliği ve inceleme_tarihi tarafından tanımlanan her bölüm içindeki satırları sıralamak için DENSE_RANK() pencere işlevi kullanılır. Sıralama iki kritere göre belirlenir: azalan sırada inceleme_skoru ve azalan sırada yararlı_oylar. Bu, daha yüksek inceleme puanlarına ve daha fazla sayıda faydalı oyu olan satırlara daha düşük sıralarda atanacağı anlamına gelir.

3. Adım: Sorgu Yapısını Parçalayın

Şimdi sorgunun yapısını inceleyelim:

SELECT 
  customer_id, 
  product_id, 
  review_date, 
  review_score, 
  helpful_votes 
FROM 
  (
    SELECT 
      customer_id, 
      product_id, 
      review_date, 
      review_score, 
      helpful_votes, 
      DENSE_RANK() OVER (
        PARTITION BY product_id, 
        review_date 
        ORDER BY 
          review_score DESC, 
          helpful_votes DESC
      ) AS rank_within_product 
    FROM 
      product_reviews
  ) ranked_reviews 
WHERE 
  rank_within_product = 1;

 

  • SELECT Clause: Nihai sonuca dahil edilecek sütunları belirtir. Müşteri_kimliği, ürün_kimliği, inceleme_tarihi, inceleme_skoru ve yararlı_oyları içerir.
  • FROM Maddesi: Bu bölüm, ürün_reviews tablosundan sütunları seçen ve DENSE_RANK() kullanarak hesaplanmış bir sütun ekleyen bir alt sorgu (parantez içinde) içerir. Hesaplama, ürün_kimliği ve inceleme_tarihi tarafından tanımlanan bir bölüm üzerinden gerçekleştirilir ve sıralama, azalan sırada hem inceleme_skoruna hem de yararlı_votes'a dayalıdır.
  • DENSE_RANK() Fonksiyonu: Bu fonksiyon, alt sorgu içerisinde, belirtilen kriterlere göre her satıra bir sıralama atamak için uygulanır. Sıralama, her ürün_kimliği ve inceleme_tarihi kombinasyonu için ayrı ayrı yapılır.
  • WHERE Maddesi: Sonuçları, yalnızca rütbe_içindeki_ürün değerinin 1'e eşit olduğu satırları içerecek şekilde filtreler. Bu, her inceleme tarihinde her ürün için yalnızca en üst sıradaki satırın nihai sonuca dahil edilmesini sağlar.

4. Adım: Sorguyu Çalıştırın

Bu sorgunun yürütülmesi istenen bilgileri içeren bir sonuç kümesi üretecektir: her bir ürün ve inceleme tarihi kombinasyonundaki hem inceleme puanına hem de yararlı oylara dayalı olarak en üst sıradaki inceleme için customer_id, ürün_id, inceleme_tarihi, inceleme_skor ve yararlı_votes.

Adım 5: Çıktıyı Gözden Geçirin

top_reviewers adlı son çıktı tablosu, hem inceleme puanı hem de faydalı oyların sayısı dikkate alınarak, her inceleme tarihinde her ürün için en üst sıradaki incelemeleri görüntüler.

Süre DENSE_RANK() SQL'de son derece yararlı bir fonksiyondur; analistlerin, özellikle de SQL'e yeni başlayanların onu kullanırken hata yapması alışılmadık bir durum değildir. Bu yaygın hatalardan bazılarına ve bunlardan nasıl kaçınılacağına daha yakından bakalım.

Yaygın bir hata, nasıl olduğunu yanlış anlamaktır. DENSE_RANK() null değerleri işler. Bazı SQL fonksiyonlarının aksine, DENSE_RANK() tüm NULL'ları aynı olarak ele alır. Bu, bazı değerlerin NULL olduğu verileri sıralıyorsanız, DENSE_RANK() tüm NULL değerlerine aynı dereceyi atayacaktır. NULL değerleri içeren veri kümeleriyle çalışırken buna dikkat edin ve NULL'ları, bağlamınızdaki anlamlarını temsil eden bir değerle değiştirmeyi veya özel gereksinimlerinize bağlı olarak bunları hariç tutmayı düşünün.

Sık karşılaşılan bir başka hata da, kullanırken bölümlendirmenin öneminin gözden kaçırılmasıdır. DENSE_RANK(). 'PARTITION BY' deyimi, verilerinizi farklı bölümlere ayırmanıza ve bu bölümler içinde sıralama yapmanıza olanak tanır. 'PARTITION BY' seçeneğini kullanmayı ihmal etmek, özellikle farklı kategoriler veya gruplar için sıralamaların yeniden başlatılmasını istediğinizde hatalı sonuçlara yol açabilir.

Bununla ilgili olarak uygunsuz kullanım söz konusudur. ORDER BY ile cümle DENSE_RANK(). DENSE_RANK() Sıralamaları varsayılan olarak artan sırada atar; bu, en küçük değerin 1 sırasını alacağı anlamına gelir. Sıralamanın azalan sırada olmasını istiyorsanız, 'DESC' anahtar kelimesini kelimenize eklemelisiniz. ORDER BY cümle. Bunu yapmamak, beklentilerinizle uyuşmayabilecek sıralamalar üretecektir.

Son olarak, bazı analistler yanlışlıkla DENSE_RANK() nerede ROW_NUMBER() or RANK() daha uygun olabilir veya tam tersi. Daha önce tartıştığımız gibi, bu işlevlerin üçünün de benzersiz davranışları vardır. Bu nüansları anlamak ve özel kullanım durumunuz için doğru işlevi seçmek, doğru ve etkili veri analizi yapmak açısından kritik öneme sahiptir.

DENSE_RANK()'da Uzmanlaşmak SQL'de Verimli Veri Analizini Nasıl Geliştirir?

Kullanımına hakim olmak DENSE_RANK() Özellikle sıralamaların ve karşılaştırmaların söz konusu olduğu durumlarda, SQL'deki veri analizinin verimliliğini önemli ölçüde artırabilir. Bu işlev, herhangi bir sıra numarasını atlamadan aynı dereceyi aynı değerlere atayarak sıralama ölçeğinde sürekliliği koruyan, sıralamaya yönelik incelikli bir yaklaşım sunar.

Bu, özellikle veri noktalarının sıklıkla aynı değerleri paylaşabildiği büyük veri kümelerinin analizinde faydalıdır. Örneğin bir satış veri setinde birden fazla satış elemanı aynı satış rakamlarına ulaşmış olabilir. DENSE_RANK() Bu satış elemanlarının her birine aynı rütbenin atandığı adil bir sıralama sağlar. Ek olarak, kullanımı DENSE_RANK() 'PARTITION BY' ile birlikte odaklanmış, kategoriye özgü analize olanak tanır.

Bu işlevin uygulaması, boş değerlerle uğraşırken daha da etkili hale gelir. Bunları sıralama sürecinin dışında bırakmak yerine, DENSE_RANK() tüm boş değerleri aynı olarak ele alır ve onlara aynı sıralamayı atar. Bu, kesin değerler eksik olsa bile veri noktalarının göz ardı edilmemesini ve dolayısıyla daha kapsamlı bir analiz yapılmasını sağlar.

SQL becerilerinizi geliştirmek için BigTechInterviews, Leetcode veya benzeri siteler gibi platformlarda çevrimiçi pratik yapmanızı öneririz.

DENSE_RANK() SQL'de ne yapar?

DENSE_RANK(), belirli bir sütuna dayalı olarak veri satırlarına sıralar atayan bir SQL pencere işlevidir. Sıralama sırasında herhangi bir boşluk bırakmadan, onlara aynı sıralamayı vererek eşitlikleri yönetir.

SQL'de RANK(), ROW_NUMBER() ve DENSE_RANK() arasındaki fark nedir?

RANK() ve ROW_NUMBER() verilere sıralama atar, ancak bağları farklı şekilde ele alırlar. RANK(), bağlı veriler için sıralamada boşluk bırakırken ROW_NUMBER(), bağları dikkate almadan her satıra benzersiz bir sayı atar. Öte yandan, DENSE_RANK(), bağlı veri noktalarına herhangi bir boşluk olmadan aynı dereceleri atar.

SQL'de WHERE yan tümcesinde DENSE_RANK() nasıl kullanılır?

DENSE_RANK() bir pencere işlevidir ve WHERE yan tümcesinde doğrudan kullanılamaz. Bunun yerine, ROW_NUMBER() veya RANK() gibi diğer işlevlerle birlikte kullanılabilir; bunlar daha sonra WHERE yan tümcesinde sıralamaya göre verileri filtrelemek için kullanılabilir.

DENSE_RANK() PARTITION BY olmadan kullanılabilir mi?

Hayır, PARTITION BY'nin belirtilmesi DENSE_RANK() fonksiyonunun düzgün çalışması için çok önemlidir. Bu olmadan, tüm veriler tek bir grup olarak değerlendirilecek ve bu da hatalı ve anlamsız sıralamaya yol açacaktır. SQL'de DENSE_RANK() kullanımında uzmanlaşmak, veri analizi becerilerinizi önemli ölçüde geliştirebilir.

RANK() ve DENSE_RANK() arasındaki fark nedir?

RANK() ve DENSE_RANK() arasındaki temel fark, bağları nasıl ele aldıklarında yatmaktadır. RANK() bağlı veriler için sıralamada boşluk bırakırken, DENSE_RANK() bağlı veri noktalarına herhangi bir boşluk olmadan aynı sıraları atar. Ek olarak, RANK() her yeni satır için sıra numarasını her zaman 1 artırırken DENSE_RANK() sürekli bir sıralamayı korur.
 
 

John Hughes Uber'de eski bir Veri Analistiydi ve BigTechInterviews (BTI) adlı SQL öğrenme platformunun kurucusuydu. Yeni programlama dilleri öğrenme ve adayların teknik mülakatları geçmeleri için gereken güveni ve becerileri kazanmalarına yardımcı olma konusunda tutkuludur. Denver, CO'yu evine çağırıyor.

spot_img

En Son İstihbarat

spot_img