Förberedelser inför SQL-intervjun · Lektion

Hantera lika värden i översta N

När du ska använda RANK eller DENSE_RANK så att alla rader med lika värden inkluderas

Lektion 2 av 413 steg

Hantera lika värden i översta N är en gratis lektion i Förberedelser inför SQL-intervjun på CoddyKit. Detta är lektion 2 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.

Följdfrågan om lika resultat

När topp-N med ROW_NUMBER sitter skärper intervjuaren frågan: ”Vad händer om två anställda har exakt samma lön vid gränsen? Ska båda tas med?”

Detta skiljer kandidater som har memorerat en enda fråga från dem som förstår rankningens innebörd. Svaret beror på valet mellan ROW_NUMBER, RANK och DENSE_RANK. Den här lektionen kopplar varje funktion till verksamhetens avsikt.

ROW_NUMBER döljer lika resultat

ROW_NUMBER tilldelar varje rad ett strikt unikt heltal. Även när två rader har samma värde i sorteringskolumnen får den ena 2 och den andra 3 i en godtycklig ordning.

Konsekvensen är att ett filter med WHERE rn <= 3 returnerar exakt 3 rader och kan tyst utesluta en rad med samma placering som egentligen borde ha tagits med. Det är rätt när ett fast antal verkligen efterfrågas, men fel när alla lika resultat ska kvalificera sig.

-- Salaries: 100, 90, 90, 80
-- ROW_NUMBER -> 1, 2, 3, 4  (the two 90s get 2 and 3 arbitrarily)
ROW_NUMBER() OVER (ORDER BY salary DESC)

RANK lämnar luckor

RANK ger rader med samma värde samma placering och hoppar över efterföljande värden för att ta hänsyn till de lika resultaten. Två rader på plats 2 får båda 2, och nästa rad får plats 4 i stället för 3.

Använd RANK när de ”tre främsta placeringarna” efterfrågas och en placering kan innehålla flera personer, som i riktiga tävlingsresultat där två silvermedaljörer innebär att ingen får brons.

-- Salaries: 100, 90, 90, 80
-- RANK -> 1, 2, 2, 4   (rank 3 is skipped)
RANK() OVER (ORDER BY salary DESC)

DENSE_RANK har inga luckor

DENSE_RANK ger också rader med samma värde samma placering, men hoppar inte över någon placering efteråt. Två rader på plats 2 får båda 2, och nästa unika värde får plats 3.

Använd DENSE_RANK när frågan gäller unika värden: ”de 3 högsta unika lönenivåerna” eller ”de 3 främsta prisnivåerna”. Den räknar unika värden, inte rader.

-- Salaries: 100, 90, 90, 80
-- DENSE_RANK -> 1, 2, 2, 3   (no gap)
DENSE_RANK() OVER (ORDER BY salary DESC)

Jämförelse sida vid sida

För lönelistan 100, 90, 90, 80 ger de tre funktionerna följande resultat:

  • ROW_NUMBER: 1, 2, 3, 4
  • RANK: 1, 2, 2, 4
  • DENSE_RANK: 1, 2, 2, 3

Den här tabellen är värd att memorera ordentligt. Intervjuaren kan helt enkelt be kandidaten fylla i den för en viss lista, och hela poängen är att få rätt på hur luckorna uppstår.

SELECT salary,
  ROW_NUMBER() OVER (ORDER BY salary DESC) AS rn,
  RANK()       OVER (ORDER BY salary DESC) AS rnk,
  DENSE_RANK() OVER (ORDER BY salary DESC) AS drnk
FROM employees;

Ta med alla lika placerade rader med RANK

För att besvara frågan ”topp 3, men ta med alla som har samma placering vid gränsen” filtrerar man med RANK() <= 3. Om två personer delar plats 3 visas båda, så resultatet kan innehålla fler än 3 rader.

Detta är avsikten bakom formuleringar som ”de 3 främsta placeringarna” i stället för ”vilka 3 rader som helst”. Ange uttryckligen att antalet rader kan överstiga N när lika resultat förekommer.

WITH ranked AS (
  SELECT name, department, salary,
         RANK() OVER (
           PARTITION BY department ORDER BY salary DESC
         ) AS rnk
  FROM employees
)
SELECT name, department, salary, rnk
FROM ranked
WHERE rnk <= 3
ORDER BY department, rnk;

De 3 högsta unika nivåerna med DENSE_RANK

När kravet är ”de 3 högsta unika lönenivåerna” och alla anställda på dessa tre nivåer ska tas med, används DENSE_RANK() <= 3.

Detta kan returnera många rader: alla anställda på de tre högsta lönenivåerna, oavsett hur många som befinner sig på varje nivå. Den viktiga insikten är att DENSE_RANK räknar unika värden, så filtret väljer värdenivåer i stället för ett fast antal rader.

WITH ranked AS (
  SELECT name, salary,
         DENSE_RANK() OVER (ORDER BY salary DESC) AS drnk
  FROM employees
)
SELECT name, salary, drnk
FROM ranked
WHERE drnk <= 3
ORDER BY drnk;

Vägledning för valet

Koppla formuleringen till funktionen:

  • ”Exakt N rader” eller paginering → ROW_NUMBER (lägg till en sekundär sorteringsnyckel).
  • ”De N främsta placeringarna, där lika resultat delar placering” → RANK.
  • ”De N högsta unika värdena, nivåerna eller kategorierna” → DENSE_RANK.

När specifikationen är tvetydig kan följande förtydligande fråga ställas: ”Om det blir lika vid gränsen, ska alla lika rader tas med eller ska resultatet begränsas till N?” Själva förtydligandet ger poäng.

Sekundära sorteringsnycklar är fortfarande viktiga

Även med RANK eller DENSE_RANK styr en sekundär nyckel i ORDER BY visningsordningen för rader med samma placering och håller resultatet stabilt. Den ändrar inte vilka rader som kvalificerar sig, men gör resultaten reproducerbara.

Med ROW_NUMBER är den sekundära sorteringsnyckeln nödvändig, eftersom den avgör vilken rad med samma värde som över huvud taget överlever rn-gränsen.

RANK() OVER (
  PARTITION BY department
  ORDER BY salary DESC, name ASC
) AS rnk

Exempel: de främsta poängplockarna

En tabell game_scores innehåller player och score. Intervjuaren vill ha ”alla spelare bland de två främsta poängplaceringarna”. Om flera delar förstaplatsen innebär det att två spelare har plats 1, och nästa unika poäng får plats 2.

”Placeringar” utan hopp efter lika resultat pekar på DENSE_RANK. Om formuleringen i stället är ”de två främsta placeringarna med luckor” används RANK. Lyssna noga på den exakta formuleringen.

WITH r AS (
  SELECT player, score,
         DENSE_RANK() OVER (ORDER BY score DESC) AS pos
  FROM game_scores
)
SELECT player, score, pos
FROM r
WHERE pos <= 2
ORDER BY pos, player;

Vanliga misstag att undvika

Fallgropar som intervjuare håller utkik efter:

  • Att använda ROW_NUMBER när frågan kräver att lika resultat tas med, vilket tyst utesluter en kvalificerad rad.
  • Att blanda ihop hur RANK och DENSE_RANK hanterar luckor.
  • Att glömma att filter med RANK/DENSE_RANK kan returnera fler än N rader och sedan hävda att resultatet är fel.
  • Att utelämna PARTITION BY när topp-N gäller per grupp, så att hela tabellen rangordnas i stället.

Snabbtest

Välj rätt rangordningsfunktion utifrån det beskrivna beteendet vid lika värden.

Sammanfattning: Hantera lika värden

Tre funktioner, tre beteenden vid lika värden:

  • ROW_NUMBER: alltid unika, exakt N rader, lika värden avgörs godtyckligt.
  • RANK: lika värden får samma rang, därefter uppstår luckor.
  • DENSE_RANK: lika värden får samma rang, inga luckor, räknar distinkta värden.

Välj utifrån hur frågan är formulerad, ställ en klargörande fråga när den är tvetydig och kom ihåg att filter på RANK/DENSE_RANK avsiktligt kan returnera fler än N rader.

Gratis att börja

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 ”Hantera lika värden i översta N” gratis?

Ja – hela texten till ”Hantera lika värden i översta N” 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 ”Hantera lika värden i översta N”?

När du ska använda RANK eller DENSE_RANK så att alla rader med lika värden inkluderas 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 2 av 4.

Hur lång tid tar lektionen ”Hantera lika värden i översta N”?

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

  1. Översta N rader per grupp med ROW_NUMBER
  2. Hantera lika värden i översta N
  3. Ta bort dubbletter på ett säkert sätt
  4. Behåll den senaste raden per nyckel
← Tillbaka till Förberedelser inför SQL-intervjun