RANK kontra DENSE_RANK vid lika värden
Den klassiska frågan om rangordning med respektive utan luckor när värden är lika
RANK kontra DENSE_RANK vid lika värden är en gratis lektion i Förberedelser inför SQL-intervjun på CoddyKit. Detta är lektion 3 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Förberedelser inför SQL-intervjun, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Förberedelser inför SQL-intervjun innehåller totalt 4 lektioner.
De tre rankningsfunktionerna sida vid sida
SQL ger er tre fönsterfunktioner för rankning, och den vanligaste intervjufrågan om fönsterfunktioner är hur de skiljer sig åt vid lika värden:
- ROW_NUMBER — alltid unikt; lika värden får godtyckligt olika nummer.
- RANK — lika värden delar rang, och nästa rang hoppar över nummer (lämnar en lucka).
- DENSE_RANK — lika värden delar rang, och nästa rang hoppar inte över något nummer (ingen lucka).
Att kunna återge denna skillnad direkt är ett tydligt tecken på kompetens i en intervju.
En konkret exempeltabell
Föreställ er fem poängtal i fallande ordning: 100, 90, 90, 80, 70. Se hur varje funktion numrerar dem.
- ROW_NUMBER: 1, 2, 3, 4, 5
- RANK: 1, 2, 2, 4, 5 (hoppar över 3 efter lika värden)
- DENSE_RANK: 1, 2, 2, 3, 4 (ingen lucka)
Memorera exemplet 100/90/90/80/70 — det besvarar frågan direkt.
SELECT
score,
ROW_NUMBER() OVER (ORDER BY score DESC) AS rownum,
RANK() OVER (ORDER BY score DESC) AS rnk,
DENSE_RANK() OVER (ORDER BY score DESC) AS dense
FROM scores;Så beräknar RANK luckan
RANK tilldelar varje rad en rang som är ett plus antalet rader som föregår den strikt i sorteringsordningen. De två raderna med värdet 90 föregås vardera av en rad (100), så båda får rang 2. Nästa, lägre värde föregås av tre rader och hoppar därför till rang 4.
Det är därför RANK motsvarar tävlingspoäng: delade silverplatser, ingen bronsplats.
-- scores 100,90,90,80 -> RANK = 1,2,2,4
SELECT score, RANK() OVER (ORDER BY score DESC) AS rnk
FROM scores;Så undviker DENSE_RANK luckan
DENSE_RANK tilldelar en rang som är ett plus antalet distinkta värden som föregår det aktuella värdet. Efter lika värden på 90 hade bara två distinkta värden kommit före 80 (100 och 90), så det får rang 3 — utan lucka.
Använd DENSE_RANK när ni bryr er om placeringar baserade på distinkta värden, till exempel "den näst högsta lönen" där lika värden måste räknas en gång.
-- scores 100,90,90,80 -> DENSE_RANK = 1,2,2,3
SELECT score, DENSE_RANK() OVER (ORDER BY score DESC) AS dense
FROM scores;När du ska välja varje funktion
En snabb beslutsguide som intervjuare gärna vill höra:
- Behöver du exakt en rad per placering (senaste posten, paginering)? → ROW_NUMBER.
- Behöver du en resultatlista där lika resultat får samma placering och luckorna blir korrekta (sportslig rangordning, topp 3 inklusive lika resultat)? → RANK.
- Behöver du det N:e distinkta värdet (den N:e högsta lönen)? → DENSE_RANK.
Fel val ändrar vilka rader du returnerar, så motivera ditt val högt.
Rangordning inom partitioner
Alla tre funktionerna accepterar PARTITION BY för att rangordna separat inom varje grupp. Varje partition börjar om på rang 1.
Här rangordnas varje avdelnings egna anställda efter lön, och lika löner hanteras med DENSE_RANK. Den högst betalda personen i varje avdelning får rang 1, och anställda med samma lön delar rang.
SELECT
department,
name,
salary,
DENSE_RANK() OVER (
PARTITION BY department
ORDER BY salary DESC
) AS salary_rank
FROM employees;Genomgångsexempel: topp 3 inklusive lika resultat
"Returnera de 3 högsta lönerna per avdelning och ta med alla om flera personer delar tredjeplatsen." Detta kräver RANK eller DENSE_RANK, inte ROW_NUMBER.
Med DENSE_RANK <= 3 behålls de tre högsta distinkta lönenivåerna och alla anställda på dessa nivåer — exakt vad "inklusive lika resultat" innebär.
SELECT department, name, salary, salary_rank
FROM (
SELECT department, name, salary,
DENSE_RANK() OVER (
PARTITION BY department ORDER BY salary DESC
) AS salary_rank
FROM employees
) t
WHERE salary_rank <= 3;Genomgångsexempel: näst högsta lön
Den mest klassiska SQL-intervjufrågan. Det robusta svaret använder DENSE_RANK så att flera högsta löner inte gör det verkliga andrahandsvärdet omöjligt att hitta.
Om tre personer har den högsta lönen identifierar DENSE_RANK = 2 fortfarande korrekt nästa distinkta lön, medan ROW_NUMBER = 2 bara skulle returnera ytterligare en person med högsta lön.
SELECT DISTINCT salary AS second_highest
FROM (
SELECT salary, DENSE_RANK() OVER (ORDER BY salary DESC) AS dr
FROM employees
) t
WHERE dr = 2;RANK kontra DENSE_RANK för "N:e högsta"
Varför välja DENSE_RANK framför RANK för problem om det N:e högsta värdet? Eftersom RANK lämnar luckor. Med lönerna 100, 100, 90 får värdet 90 RANK = 3 men DENSE_RANK = 2.
Om frågan gäller den "2:a högsta distinkta lönen" ger filtrering på RANK = 2 inga resultat, medan DENSE_RANK = 2 korrekt returnerar 90. Koppla alltid "N:e distinkta" till DENSE_RANK.
-- salaries 100,100,90
-- RANK: 1,1,3 -> WHERE rank = 2 returns NOTHING
-- DENSE_RANK: 1,1,2 -> WHERE dense_rank = 2 returns 90Anteckningar om SQL-dialekter
Goda nyheter: ROW_NUMBER, RANK och DENSE_RANK följer SQL-standarden och fungerar likadant i PostgreSQL, SQL Server, Oracle, MySQL 8+, BigQuery och Snowflake. Reglerna för lika värden ovan är universella.
En relaterad funktion, PERCENT_RANK, bygger på RANK för att ge en relativ position från 0 till 1 — värt att nämna om en intervjuare frågar om percentilrangordning.
Vanliga misstag
Se upp med följande:
- Att använda
ROW_NUMBERför "N:e högsta" och missa rader med lika värden. - Att använda
RANKnär frågan gäller distinkta värden och sedan få tomma resultat på grund av luckorna. - Att glömma
ORDER BYinutiOVER— rangordning är meningslös utan den. - Att filtrera rangordningen direkt i
WHEREi stället för i en yttre fråga.
Snabbtest
Tillämpa reglerna för lika värden.
Sammanfattning: med och utan luckor
Nu kan du välja rätt rangordningsfunktion direkt:
- ROW_NUMBER: unika nummer, inga delade placeringar.
- RANK: lika värden delar placering, därefter en lucka (1,2,2,4).
- DENSE_RANK: lika värden delar placering, utan lucka (1,2,2,3).
- "N:e högsta distinkta" →
DENSE_RANK; "topp N inklusive lika resultat" →RANK/DENSE_RANK; "en rad per placering" →ROW_NUMBER.
Nästa steg: hur du faktiskt filtrerar på ett fönsterresultat, eftersom du inte kan göra det i WHERE.
Lär dig SQL med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 30
- Lektioner
- 120
Vanliga frågor
Är lektionen ”RANK kontra DENSE_RANK vid lika värden” gratis?
Ja – hela texten till ”RANK kontra DENSE_RANK vid lika värden” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Förberedelser inför SQL-intervjun, kan Ni uppgradera till CoddyKit PRO. Kursen i Förberedelser inför SQL-intervjun innehåller totalt 4 lektioner.
Vad lär jag mig i ”RANK kontra DENSE_RANK vid lika värden”?
Den klassiska frågan om rangordning med respektive utan luckor när värden är lika Ni övar på Förberedelser inför SQL-intervjun med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Förberedelser inför SQL-intervjun?
Du behöver inga förkunskaper. Utbildningen i Förberedelser inför SQL-intervjun på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 4.
Hur lång tid tar lektionen ”RANK kontra DENSE_RANK vid lika värden”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Förberedelser inför SQL-intervjun-lektionen?
Ja. Varje Förberedelser inför SQL-intervjun-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- OVER, PARTITION BY och ORDER BY
- ROW_NUMBER för unik numrering
- RANK kontra DENSE_RANK vid lika värden
- Filtrera på ett fönsterresultat