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
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 rnkExempel: 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_NUMBERnär frågan kräver att lika resultat tas med, vilket tyst utesluter en kvalificerad rad. - Att blanda ihop hur
RANKochDENSE_RANKhanterar luckor. - Att glömma att filter med
RANK/DENSE_RANKkan returnera fler än N rader och sedan hävda att resultatet är fel. - Att utelämna
PARTITION BYnä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.
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
- Översta N rader per grupp med ROW_NUMBER
- Hantera lika värden i översta N
- Ta bort dubbletter på ett säkert sätt
- Behåll den senaste raden per nyckel