Zephyrnet-logo

DENSE_RANK(): een stapsgewijze handleiding voor SQL-liefhebbers – KDnuggets

Datum:

DENSE_RANK(): een stapsgewijze handleiding voor SQL-liefhebbers
Afbeelding door redacteur
 

In de huidige datagestuurde wereld vormt SQL (Structured Query Language) een hoeksteen voor het beheren en manipuleren van databasesystemen. Een kerncomponent van de kracht en flexibiliteit van SQL ligt in de vensterfuncties, een categorie functies die berekeningen uitvoeren over sets rijen die verband houden met de huidige rij.

Stel je voor dat je door een schuifvenster naar je gegevens kijkt en op basis van de positie en grootte van dit venster berekeningen of transformaties op je gegevens uitvoert. Dat is in wezen wat SQL-vensterfuncties doen. Ze voeren taken uit zoals het berekenen van lopende totalen, gemiddelden of ranglijsten, die lastig uit te voeren zijn met standaard SQL-opdrachten.

Een van de meest robuuste tools in de toolbox voor vensterfuncties is de rangschikkingsfunctie, met name de DENSE_RANK() functie. Deze functie is een uitkomst voor data-analisten, waardoor we verschillende rijen gegevens zonder gaten kunnen rangschikken. Of u nu in verkoopcijfers, websiteverkeersgegevens of zelfs een eenvoudige lijst met testscores van studenten duikt, DENSE_RANK() is onmisbaar.

In dit artikel gaan we dieper in op de innerlijke werking van DENSE_RANK(), door het naast zijn naaste broers en zussen te plaatsen RANK() en ROW_NUMBER(), en laat zien hoe u veelvoorkomende valkuilen kunt vermijden die u tijdens uw SQL-reis kunnen tegenhouden. Klaar om uw vaardigheden op het gebied van data-analyse naar een hoger niveau te tillen? Laten we erin duiken.

Rangschikkingsfuncties in SQL zijn een subset van vensterfuncties die een unieke rangorde toewijzen aan elke rij binnen een resultatenset. Deze rangschikkingswaarden komen overeen met een specifieke volgorde, bepaald door de ORDER BY-clausule binnen de functie. Rankingfuncties vormen een steunpilaar van SQL en worden veelvuldig gebruikt bij data-analyse voor diverse taken, zoals het vinden van de beste verkoper, het identificeren van de best presterende webpagina of het bepalen van de best scorende film voor een bepaald jaar.

Er zijn drie belangrijke rangschikkingsfuncties in SQL, namelijk RANK(), ROW_NUMBER() en DENSE_RANK(). Elk van deze functies werkt iets anders, maar ze dienen allemaal het gemeenschappelijke doel van het rangschikken van gegevens op basis van gespecificeerde voorwaarden. RANK() en DENSE_RANK() functies gedragen zich vergelijkbaar in die zin dat ze dezelfde rangorde toewijzen aan rijen met identieke waarden. Het cruciale verschil ligt in de manier waarop ze omgaan met de volgende rang. RANK() slaat de volgende rang over terwijl DENSE_RANK() doet niet.

Aan de andere kant, de ROW_NUMBER() De functie wijst een uniek rijnummer toe aan elke rij, ongeacht of de volgorde van de kolomwaarden identiek is. Terwijl RANK(), DENSE_RANK() en ROW_NUMBER() lijken in één oogopslag misschien uitwisselbaar, maar het begrijpen van hun nuances is cruciaal voor effectieve data-analyse in SQL. De keuze tussen deze functies kan een aanzienlijke impact hebben op uw resultaten en de inzichten die uit uw gegevens worden afgeleid.

DENSE_RANK() is een krachtige rangschikkingsfunctie in SQL die een unieke rangwaarde toewijst binnen een opgegeven partitie. In essentie, DENSE_RANK() geeft non-gap-ranglijsten voor uw gegevens, wat betekent dat elke unieke waarde een aparte rang krijgt, en identieke waarden dezelfde rang krijgen. In tegenstelling tot zijn tegenhanger RANK(), DENSE_RANK() slaat geen rang over als er een gelijkspel is tussen de waarden.

Laten we, om het uit te leggen, een scenario visualiseren waarin u een dataset met studentenscores heeft en drie studenten dezelfde score hebben behaald, bijvoorbeeld 85 punten. Gebruik makend van RANK()krijgen alle drie de leerlingen rang 1, maar de volgende beste score krijgt rang 4, waarbij rang 2 en 3 worden overgeslagen. DENSE_RANK() gaat hier anders mee om. Er wordt aan alle drie de studenten een rangorde van 1 toegekend, en de volgende beste score krijgt een rangorde van 2, zodat er geen gat in de rangschikking ontstaat.

Dus, wanneer moet je gebruiken DENSE_RANK()? Het is vooral handig in scenario's waarin u een continue rangschikking zonder onderbrekingen nodig heeft. Overweeg een gebruiksscenario waarbij u de drie beste artiesten moet belonen. Als u banden heeft met uw gegevens, gebruikt u RANK() kan ertoe leiden dat u een verdienstelijke kandidaat misloopt. Dat is wanneer DENSE_RANK() komt te hulp en zorgt ervoor dat alle topscorers de nodige erkenning krijgen en dat de ranglijsten niet worden overgeslagen.

Inzicht in de verschillen tussen DENSE_RANK(), RANK() en ROW_NUMBER() is essentieel voor efficiënte data-analyse in SQL. Alle drie de functies zijn krachtig, maar hun subtiele verschillen kunnen de uitkomst van uw data-analyse aanzienlijk beïnvloeden.

Laten we beginnen met RANK(). Deze functie kent een unieke rang toe aan elke afzonderlijke waarde binnen een dataset, waarbij dezelfde rang wordt toegewezen aan identieke waarden. Echter, wanneer RANK() een gelijkspel tegenkomt (identieke waarden), slaat het de volgende rang(en) in de reeks over. Als u bijvoorbeeld drie producten heeft met dezelfde verkoopcijfers, RANK() zal aan elk van deze producten dezelfde rang toekennen, maar zal dan de volgende rang overslaan. Dit betekent dat als deze drie producten de best verkochte producten zijn, ze allemaal rang 1 krijgen, maar dat het volgende best verkopende product rang 4 krijgt, en niet rang 2.

Laten we vervolgens eens kijken naar: DENSE_RANK(). Gelijkwaardig aan RANK(), DENSE_RANK() kent dezelfde rang toe aan identieke waarden, maar slaat geen rang over. Met behulp van het vorige voorbeeld, met DENSE_RANK(), zouden de drie best verkochte producten nog steeds rang 1 krijgen, maar zou het volgende best verkopende product rang 2 krijgen, en niet rang 4.

Tenslotte ROW_NUMBER() hanteert een andere aanpak. Het kent een unieke rang toe aan elke rij, ongeacht of de waarden identiek zijn. Dit betekent dat zelfs als drie producten dezelfde verkoopcijfers hebben, ROW_NUMBER() wijst aan elke rij een uniek nummer toe, waardoor het perfect is voor situaties waarin u aan elke rij een aparte identificatie moet toewijzen.

De syntaxis van DENSE_RANK() is eenvoudig. Het wordt gebruikt in combinatie met de OVER() clausule, waarbij de gegevens worden gepartitioneerd voordat rangen worden toegewezen. De syntaxis is als volgt: DENSE_RANK() OVER (ORDER BY column). Hier, column verwijst naar de kolom waarop u uw gegevens wilt rangschikken. Laten we een voorbeeld bekijken waarin we een tabel hebben met de naam Sales met kolommen SalesPerson en SalesFigures. Om de verkopers te rangschikken op basis van hun verkoopcijfers, gebruiken we de DENSE_RANK() functioneren als volgt: DENSE_RANK() OVER (ORDER BY SalesFigures DESC). Deze SQL-query rangschikt de verkopers van hoog naar laag op basis van hun verkoopcijfers.

gebruik DENSE_RANK() in combinatie met PARTITION BY kan bijzonder inzichtelijk zijn. Als u bijvoorbeeld verkopers binnen elke regio wilt rangschikken, kunt u uw gegevens opdelen op basis van Region en rangschik vervolgens binnen elke partitie. De syntaxis hiervoor zou zijn DENSE_RANK() OVER (PARTITION BY Region ORDER BY SalesFigures DESC). Op deze manier krijgt u niet alleen een uitgebreide ranglijst, maar ook een genuanceerd inzicht in de prestaties binnen elke regio.

Apple SQL-vraag: Vind de beste verkooppresteerders voor elke verkoopdatum

Tabel: verkoopgegevens

+------------+-----------+------------+
|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         |
+------------+-----------+------------+

 

uitgang

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

Oplossing voor topverkopers van Apple

Stap 1: Begrijp de gegevens

Laten we eerst de gegevens in de tabel sales_data begrijpen. Het heeft drie kolommen: werknemer_id, verkoopdatum en totale_verkoop. Deze tabel vertegenwoordigt verkoopgegevens met informatie over de werknemer, de datum van de verkoop en het totale verkoopbedrag.

Stap 2: Analyseer de functie DENSE_RANK().

De query gebruikt de vensterfunctie DENSE_RANK() om werknemers te rangschikken op basis van hun totale omzet binnen elke verkoopdatumpartitie. DENSE_RANK() wordt gebruikt om een ​​rang toe te kennen aan elke rij binnen de partitie sales_date, waarbij de volgorde gebaseerd is op total_sales in aflopende volgorde.

Stap 3: Breek de querystructuur op

Laten we nu de structuur van de query opsplitsen:

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-clausule: dit specificeert de kolommen die in het eindresultaat worden opgenomen. In dit geval zijn dit werknemer_id, verkoopdatum en totale_omzet.
  • FROM-clausule: Dit is waar de feitelijke gegevens vandaan komen. Het bevat een subquery (tussen haakjes) die kolommen uit de tabel sales_data selecteert en een berekende kolom toevoegt met behulp van DENSE_RANK().
  • DENSE_RANK() Functie: Deze functie wordt binnen de subquery gebruikt om een ​​rang aan elke rij toe te wijzen op basis van de kolom total_sales, en wordt gepartitioneerd op verkoopdatum. Dit betekent dat de rangschikking voor elke verkoopdatum afzonderlijk wordt gedaan.
  • WHERE-clausule: Hiermee worden de resultaten gefilterd om alleen rijen op te nemen waarin de sales_rank gelijk is aan 1. Dit zorgt ervoor dat alleen de best presterende verkoper voor elke verkoopdatum wordt opgenomen in het eindresultaat.

Stap 4: voer de query uit

Wanneer u deze query uitvoert, levert deze een resultatenset op met de werknemer_id, verkoopdatum en totale_verkoop voor de beste verkoper op elke verkoopdatum.

Stap 5: Bekijk de uitvoer

De uiteindelijke uitvoertabel, genaamd top_performers, zal de gewenste informatie bevatten: de beste verkoopperformer voor elke verkoopdatum, gebaseerd op de DENSE_RANK()-berekening

Google SQL-vraag: Vind voor elk product de klant die de hoogste beoordelingsscore heeft gegeven

Tabel: productbeoordelingen

+------------+-----------+-------------+-------------------------------+
|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             |
+------------+-----------+-------------+--------------+----------------+

 

uitgang

+------------+-----------+-------------+--------------+----------------+
|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             |
+------------+-----------+-------------+--------------+----------------+

Oplossing voor de hoogste beoordelingsscore van Google

Stap 1: Begrijp de gegevens

De tabel product_reviews bevat informatie over klantrecensies voor verschillende producten. Het bevat kolommen zoals klant_id, product_id, beoordelingsdatum, beoordelingsscore en nuttige_stemmen. Deze tabel bevat gegevens met betrekking tot klantrecensies, met details over de klant, het product dat wordt beoordeeld, de datum van de recensie, de recensiescore en het aantal ontvangen nuttige stemmen.

Stap 2: Analyseer de functie DENSE_RANK().

In deze query wordt de vensterfunctie DENSE_RANK() gebruikt om rijen binnen elke partitie te rangschikken die is gedefinieerd door product_id en review_date. De rangschikking wordt bepaald op basis van twee criteria: review_score in aflopende volgorde en nuttige_stemmen in aflopende volgorde. Dit betekent dat rijen met hogere beoordelingsscores en een groter aantal nuttige stemmen een lagere rang krijgen.

Stap 3: Breek de querystructuur op

Laten we nu de structuur van de query opsplitsen:

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-clausule: specificeert de kolommen die in het eindresultaat worden opgenomen. Het omvat klant_id, product_id, recensie_datum, recensie_score en nuttige_stemmen.
  • FROM-clausule: dit deel bevat een subquery (tussen haakjes) die kolommen uit de tabel product_reviews selecteert en een berekende kolom toevoegt met behulp van DENSE_RANK(). De berekening wordt uitgevoerd over een partitie die is gedefinieerd door product_id en review_date, en de rangschikking is gebaseerd op zowel review_score als nuttige_votes in aflopende volgorde.
  • DENSE_RANK() Functie: Deze functie wordt binnen de subquery toegepast om een ​​rang aan elke rij toe te wijzen op basis van de opgegeven criteria. De rangschikking wordt afzonderlijk uitgevoerd voor elke combinatie van product_id en review_date.
  • WHERE-clausule: Filtert de resultaten zodat alleen rijen worden opgenomen waarin de rang_binnen_product gelijk is aan 1. Dit zorgt ervoor dat alleen de hoogst gerangschikte rij voor elk product op elke beoordelingsdatum wordt opgenomen in het eindresultaat.

Stap 4: voer de query uit

Het uitvoeren van deze zoekopdracht levert een resultatenset op met de gewenste informatie: klant_id, product_id, beoordelingsdatum, beoordelingsscore en nuttige_stemmen voor de hoogst gerangschikte beoordeling op basis van zowel de beoordelingsscore als nuttige stemmen binnen elke combinatie van product en beoordelingsdatum.

Stap 5: Bekijk de uitvoer

De uiteindelijke uitvoertabel, genaamd top_reviewers, toont de best beoordeelde recensies voor elk product op elke recensiedatum, rekening houdend met zowel de recensiescore als het aantal nuttige stemmen.

Terwijl DENSE_RANK() is een zeer nuttige functie in SQL, het is niet ongebruikelijk dat analisten, vooral degenen die nieuw zijn met SQL, fouten maken bij het gebruik ervan. Laten we enkele van deze veelvoorkomende fouten eens nader bekijken en bekijken hoe u ze kunt vermijden.

Een veelgemaakte fout is dat je niet begrijpt hoe DENSE_RANK() verwerkt nulwaarden. In tegenstelling tot sommige SQL-functies, DENSE_RANK() behandelt alle NULL's als identiek. Dit betekent dat als u gegevens rangschikt waarvan sommige waarden NULL zijn, DENSE_RANK() wijst dezelfde rang toe aan alle NULL-waarden. Houd hier rekening mee wanneer u werkt met gegevenssets die NULL-waarden bevatten, en overweeg om NULL's te vervangen door een waarde die hun betekenis in uw context vertegenwoordigt, of ze uit te sluiten, afhankelijk van uw specifieke vereisten.

Een andere veel voorkomende fout is het over het hoofd zien van het belang van partitioneren tijdens het gebruik DENSE_RANK(). Met de clausule 'PARTITION BY' kunt u uw gegevens in afzonderlijke segmenten verdelen en de rangschikking binnen deze partities uitvoeren. Het nalaten om `PARTITION BY` te gebruiken kan tot foutieve resultaten leiden, vooral als je wilt dat de rangen voor verschillende categorieën of groepen opnieuw beginnen.

Hiermee samenhangend is het oneigenlijk gebruik van de ORDER BY clausule met DENSE_RANK(). DENSE_RANK() wijst standaard rangschikkingen in oplopende volgorde toe, wat betekent dat de kleinste waarde de rangorde 1 krijgt. Als u de rangschikking in aflopende volgorde wilt hebben, moet u het trefwoord `DESC` opnemen in uw ORDER BY clausule. Als u dit niet doet, resulteert dit in rankings die mogelijk niet overeenkomen met uw verwachtingen.

Ten slotte gebruiken sommige analisten ten onrechte DENSE_RANK() WAAR ROW_NUMBER() or RANK() wellicht passender, en omgekeerd. Zoals we hebben besproken, vertonen alle drie deze functies uniek gedrag. Het begrijpen van deze nuances en het selecteren van de juiste functie voor uw specifieke gebruikssituatie is van cruciaal belang voor het uitvoeren van nauwkeurige en effectieve data-analyses.

Hoe het beheersen van DENSE_RANK() efficiënte gegevensanalyse in SQL verbetert

Het beheersen van het gebruik van DENSE_RANK() kan de efficiëntie van data-analyse in SQL aanzienlijk verbeteren, vooral als het om rankings en vergelijkingen gaat. Deze functie biedt een genuanceerde benadering van rangschikking, een benadering die continuïteit in de rangschikkingsschaal handhaaft door dezelfde rangorde toe te kennen aan identieke waarden zonder rangnummers over te slaan.

Dit is met name handig bij het analyseren van grote datasets, waarbij datapunten vaak identieke waarden kunnen delen. In een verkoopdataset kunnen bijvoorbeeld meerdere verkopers dezelfde verkoopcijfers hebben behaald. DENSE_RANK() maakt een eerlijke rangschikking mogelijk, waarbij elk van deze verkopers dezelfde rang krijgt toegewezen. Bovendien is het gebruik van DENSE_RANK() in combinatie met `PARTITION BY` maakt gerichte, categoriespecifieke analyse mogelijk.

De toepassing van deze functie wordt zelfs nog krachtiger bij het omgaan met nulwaarden. In plaats van deze uit te sluiten van het rangschikkingsproces, DENSE_RANK() behandelt alle nulwaarden als identiek en kent ze dezelfde rangorde toe. Dit zorgt ervoor dat, ook al ontbreken de exacte waarden, de gegevenspunten niet worden genegeerd, waardoor een uitgebreidere analyse wordt verkregen.

Om uw SQL-vaardigheden te verbeteren, raden we u aan online te oefenen op platforms zoals BigTechInterviews, Leetcode of soortgelijke sites.

Wat doet DENSE_RANK() in SQL?

DENSE_RANK() is een SQL-vensterfunctie die rangen toewijst aan rijen met gegevens op basis van een opgegeven kolom. Het behandelt gelijkspel door ze dezelfde rang te geven zonder gaten in de rangorde achter te laten.

Wat is het verschil tussen RANK(), ROW_NUMBER() en DENSE_RANK() in SQL?

RANK() en ROW_NUMBER() kennen rangen toe aan gegevens, maar gaan op een andere manier om met relaties. RANK() laat gaten in de rangschikking voor gekoppelde gegevens, terwijl ROW_NUMBER() een uniek nummer aan elke rij toewijst zonder rekening te houden met verbanden. Aan de andere kant wijst DENSE_RANK() identieke rangen toe aan gekoppelde datapunten, zonder gaten.

Hoe gebruik ik DENSE_RANK() in de WHERE-clausule in SQL?

DENSE_RANK() is een vensterfunctie en kan niet rechtstreeks worden gebruikt in de WHERE-clausule. In plaats daarvan kan het worden gebruikt in combinatie met andere functies zoals ROW_NUMBER() of RANK(), die vervolgens in de WHERE-clausule kunnen worden gebruikt om gegevens te filteren op basis van rang.

Kan DENSE_RANK() worden gebruikt zonder PARTITION BY?

Nee, het opgeven van PARTITION BY is cruciaal voor de goede werking van DENSE_RANK(). Zonder dit zouden alle gegevens als één groep worden behandeld, wat zou leiden tot een onnauwkeurige en betekenisloze rangschikking. Het beheersen van het gebruik van DENSE_RANK() in SQL kan uw vaardigheden op het gebied van gegevensanalyse aanzienlijk verbeteren.

Wat is het verschil tussen RANK() en DENSE_RANK()?

Het belangrijkste onderscheid tussen RANK() en DENSE_RANK() ligt in de manier waarop ze omgaan met relaties. Terwijl RANK() gaten laat in de rangschikking van gekoppelde gegevens, wijst DENSE_RANK() identieke rangen toe aan gekoppelde gegevenspunten zonder gaten. Bovendien verhoogt RANK() het rangnummer altijd met 1 voor elke nieuwe rij, terwijl DENSE_RANK() een continue rangschikking handhaaft.
 
 

John Hughes was een voormalig data-analist bij Uber en oprichter van het SQL-leerplatform genaamd BigTechInterviews (BTI). Hij heeft een passie voor het leren van nieuwe programmeertalen en het helpen van kandidaten om het vertrouwen en de vaardigheden te verwerven om te slagen voor hun technische sollicitatiegesprekken. Hij belt Denver, CO naar huis.

spot_img

Laatste intelligentie

spot_img