0Pricing
SQL Interview Prep · Lezione

Gestire le parità nelle Top-N

Capire quando usare RANK o DENSE_RANK per includere tutte le righe a pari merito

Gestire le parità nelle Top-N è una lezione SQL Interview Prep gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento SQL Interview Prep, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso SQL Interview Prep include 4 lezioni in totale.

La domanda successiva sui pari merito

Una volta risolto il top-N con ROW_NUMBER, l'intervistatore insiste: "Cosa succede se due dipendenti hanno esattamente lo stesso stipendio alla soglia? Devono essere inclusi entrambi?"

Questa domanda distingue chi ha memorizzato una query da chi comprende la semantica delle classifiche. La risposta dipende dalla scelta tra ROW_NUMBER, RANK e DENSE_RANK. Questa lezione collega ogni funzione all'obiettivo aziendale.

ROW_NUMBER nasconde i pari merito

ROW_NUMBER assegna a ogni riga un intero strettamente univoco. Anche quando due righe hanno lo stesso valore nella colonna di ordinamento, una riceve 2 e l'altra 3 secondo un ordine arbitrario.

Conseguenza: un filtro WHERE rn <= 3 restituisce esattamente 3 righe e può escludere silenziosamente una riga a pari merito che avrebbe avuto motivo di essere inclusa. Questo va bene quando si desidera davvero un numero fisso di righe, ma non quando tutti i pari merito devono essere ammessi.

-- 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 lascia dei salti

RANK assegna alle righe a pari merito la stessa posizione, poi salta i valori successivi per tenere conto dei pari merito. Due righe a pari merito in posizione 2 ricevono entrambe 2 e la riga successiva passa alla posizione 4, non 3.

Utilizzi RANK quando desidera le "prime 3 posizioni" e una posizione può essere occupata da più persone, come nelle classifiche sportive reali in cui due medaglie d'argento significano che non viene assegnata quella di bronzo.

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

DENSE_RANK non presenta salti

DENSE_RANK assegna anch'essa alle righe a pari merito la stessa posizione, ma non salta quella successiva. Due righe a pari merito in posizione 2 ricevono entrambe 2 e il valore distinto successivo è 3.

Utilizzi DENSE_RANK quando la domanda riguarda i valori distinti: "i 3 livelli salariali distinti più alti" oppure "le 3 fasce di prezzo più alte". Conta i valori univoci, non le righe.

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

Confronto affiancato

Per l'elenco degli stipendi 100, 90, 90, 80 le tre funzioni producono:

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

Vale la pena memorizzare questa tabella alla perfezione. L'intervistatore potrebbe semplicemente chiederLe di completarla per un determinato elenco, e capire il comportamento dei salti è proprio l'obiettivo della domanda.

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;

Includere tutte le righe a pari merito con RANK

Per rispondere a "prime 3 posizioni, includendo tutti quelli a pari merito sulla soglia", applichi il filtro RANK() <= 3. Se due persone condividono la posizione 3, compaiono entrambe, quindi il risultato può contenere più di 3 righe.

Questo è l'obiettivo delle domande formulate come "prime 3 posizioni" anziché "3 righe qualsiasi". Dichiari esplicitamente che il numero di righe può superare N quando si verificano pari merito.

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;

I 3 livelli distinti più alti con DENSE_RANK

Quando il requisito è "i 3 livelli salariali distinti più alti" e desidera ogni dipendente appartenente a quei tre livelli, utilizzi DENSE_RANK() <= 3.

Questo può restituire molte righe: tutti i dipendenti appartenenti alle tre fasce retributive più alte, indipendentemente da quanto siano numerose. L'idea fondamentale è che DENSE_RANK conta i valori distinti, quindi il filtro seleziona fasce di valori e non un numero fisso di righe.

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;

Guida alla scelta

Colleghi la formulazione alla funzione:

  • "Esattamente N righe" o paginazione → ROW_NUMBER (aggiunga un criterio di spareggio).
  • "Prime N posizioni, con la stessa posizione per i pari merito" → RANK.
  • "Primi N valori / livelli / fasce distinti" → DENSE_RANK.

Quando la specifica è ambigua, chieda: "Se si verifica un pari merito sulla soglia, devo includere tutte le righe a pari merito o limitare il risultato a N?" Questa domanda di chiarimento vale già dei punti.

I criteri di spareggio restano importanti

Anche con RANK o DENSE_RANK, l'aggiunta di una chiave secondaria in ORDER BY controlla l'ordine di visualizzazione delle righe a pari merito e mantiene stabile l'output. Non cambia quali righe soddisfano il filtro, ma rende i risultati riproducibili.

Con ROW_NUMBER, il criterio di spareggio è essenziale perché determina quale riga a pari merito supera il filtro rn.

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

Esempio svolto: i migliori punteggi

Una tabella game_scores contiene player e score. L'intervistatore vuole "tutti i giocatori nelle prime 2 posizioni in classifica". Un pari merito al primo posto significa due giocatori in posizione 1, poi il punteggio distinto successivo occupa la posizione 2.

"Posizioni" senza salti dopo un pari merito indica DENSE_RANK. Se invece dicesse "le prime 2 posizioni in classifica con salti", utilizzerebbe RANK. Presti attenzione alla formulazione esatta.

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;

Errori comuni da evitare

Gli errori a cui gli intervistatori prestano attenzione:

  • Usare ROW_NUMBER quando la domanda richiede di includere i pari merito, escludendo silenziosamente una riga che soddisfa il requisito.
  • Confondere il comportamento dei salti di RANK e DENSE_RANK.
  • Dimenticare che i filtri con RANK/DENSE_RANK possono restituire più di N righe e poi sostenere che il risultato sia errato.
  • Omettere PARTITION BY quando il top-N è richiesto per gruppo, classificando invece l'intera tabella.

Verifica rapida

Scelga la funzione di ranking corretta per il comportamento dei valori a pari merito descritto.

Riepilogo: gestione dei pari merito

Tre funzioni, tre comportamenti in caso di pari merito:

  • ROW_NUMBER: sempre univoca, esattamente N righe, con i pari merito risolti arbitrariamente.
  • RANK: i pari merito condividono la posizione, poi si creano dei salti.
  • DENSE_RANK: i pari merito condividono la posizione, senza salti, contando i valori distinti.

Scelga in base alla formulazione della domanda, ponga una domanda di chiarimento quando è ambigua e ricordi che i filtri su RANK/DENSE_RANK possono restituire per progettazione più di N righe.

Domande Frequenti

La lezione «Gestire le parità nelle Top-N» è gratuita?

Sì — il testo completo di «Gestire le parità nelle Top-N» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso SQL Interview Prep, passa a CoddyKit PRO. Il corso SQL Interview Prep include 4 lezioni in totale.

Cosa imparerò in «Gestire le parità nelle Top-N»?

Capire quando usare RANK o DENSE_RANK per includere tutte le righe a pari merito Eserciti SQL Interview Prep con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare SQL Interview Prep?

Non è richiesta alcuna esperienza precedente. SQL Interview Prep su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.

Quanto tempo richiede la lezione «Gestire le parità nelle Top-N»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione SQL Interview Prep?

Sì. Ogni lezione SQL Interview Prep include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Righe Top-N per gruppo con ROW_NUMBER
  2. Gestire le parità nelle Top-N
  3. Deduplicare le righe in sicurezza
  4. Conservare l'ultima riga per chiave
← Torna a SQL Interview Prep