Serie completa di problemi per una simulazione di colloquio
Problemi completi da risolvere a tempo, che combinano join, funzioni finestra e CTE in condizioni simili a un colloquio.
Serie completa di problemi per una simulazione di colloquio è una lezione Coding Interview Prep gratuita su CoddyKit. Questa è la lezione 4 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 Coding Interview Prep, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Coding Interview Prep include 4 lezioni in totale.
Come si svolge un colloquio SQL
Questo capitolo conclusivo La guida attraverso problemi simulati completi che combinano join, funzioni finestra e CTE in condizioni di colloquio. Prima di tutto, la competenza trasversale: come comportarsi durante il colloquio.
- Riformuli il problema e confermi lo schema.
- Chiarisca i casi limite (NULL, pari merito, duplicati) prima di scrivere il codice.
- Esponga il proprio approccio, poi scriva la query.
- Verifichi mentalmente la soluzione su un campione minimo.
Gli intervistatori valutano il processo tanto quanto la query finale.
Lo schema condiviso
Tutti i problemi seguenti usano questo piccolo schema e-commerce. Lo legga una volta, così ogni query sarà comprensibile.
customers(id, name, country)orders(id, customer_id, order_date, status, amount)order_items(order_id, product_id, quantity)products(id, name, category, price)
Tenga presente questo schema: il resto della lezione farà riferimento a queste tabelle.
-- orders.status is one of: 'paid','pending','cancelled'
-- amount is the order total in the customer's currencyProblema 1: clienti principali per spesa
"Restituisca i primi 3 clienti per spesa totale pagata, con il relativo nome e totale."
Approccio: filtri gli ordini pagati, aggreghi per cliente, ordini e limiti il risultato. Dichiari di escludere gli ordini annullati e in sospeso, un caso limite inserito appositamente dagli intervistatori.
SELECT c.name,
SUM(o.amount) AS total_spend
FROM customers c
JOIN orders o ON o.customer_id = c.id
WHERE o.status = 'paid'
GROUP BY c.id, c.name
ORDER BY total_spend DESC
LIMIT 3;Problema 2: clienti che non hanno mai effettuato ordini
"Elenchi i clienti che non hanno mai effettuato un ordine." Questo è il modello anti-join. Due soluzioni pulite: LEFT JOIN con IS NULL oppure NOT EXISTS.
Preferisca NOT EXISTS perché è sicuro rispetto a NULL (a differenza di NOT IN). Citi questa distinzione: è esattamente ciò su cui l'intervistatore sta cercando di metterLa alla prova.
-- NULL-safe anti-join
SELECT c.id, c.name
FROM customers c
WHERE NOT EXISTS (
SELECT 1
FROM orders o
WHERE o.customer_id = c.id
);Problema 3: secondo importo d'ordine più alto
"Trovi il secondo importo d'ordine distinto più alto." La soluzione più pulita e a prova di pari merito usa DENSE_RANK, così gli importi duplicati condividono lo stesso rank.
Un caso limite da segnalare: se non esiste un secondo valore distinto, non vengono restituite righe; ciò può essere accettabile oppure può richiedere un wrapper COALESCE, a seconda dei requisiti.
SELECT amount
FROM (
SELECT amount,
DENSE_RANK() OVER (ORDER BY amount DESC) AS rnk
FROM orders
) ranked
WHERE rnk = 2;Problema 4: ultimo ordine per cliente
"Restituisca l'ordine più recente di ciascun cliente." Questo è il modello per mantenere l'ultima riga per chiave, risolto con ROW_NUMBER partizionato per cliente e ordinato per data decrescente.
Aggiunga un criterio di spareggio (l'ID dell'ordine), così il risultato è deterministico quando due ordini hanno la stessa data: è un dettaglio che i candidati migliori includono.
SELECT customer_id, id AS order_id, order_date, amount
FROM (
SELECT o.*,
ROW_NUMBER() OVER (
PARTITION BY customer_id
ORDER BY order_date DESC, id DESC
) AS rn
FROM orders o
) t
WHERE rn = 1;Problema 5: crescita mese su mese
"Calcoli i ricavi mensili pagati e la relativa variazione percentuale rispetto al mese precedente." Questo combina un'aggregazione in una CTE con LAG.
Nel primo passaggio aggreghi per mese; nel secondo confronti ogni mese con quello precedente usando LAG. Protegga la divisione, così il primo mese (che non ha un precedente) non genera errori.
WITH monthly AS (
SELECT DATE_TRUNC('month', order_date) AS mth,
SUM(amount) AS revenue
FROM orders
WHERE status = 'paid'
GROUP BY DATE_TRUNC('month', order_date)
)
SELECT mth,
revenue,
LAG(revenue) OVER (ORDER BY mth) AS prev_revenue,
ROUND(
100.0 * (revenue - LAG(revenue) OVER (ORDER BY mth))
/ NULLIF(LAG(revenue) OVER (ORDER BY mth), 0), 2
) AS pct_change
FROM monthly
ORDER BY mth;Problema 6: prodotto principale per categoria
"Per ogni categoria, restituisca il prodotto più venduto in base alla quantità totale." È il modello top-N per gruppo: aggreghi, assegni il rank all'interno della partizione e filtri per il rank 1.
Se i pari merito sono importanti, sostituisca ROW_NUMBER con RANK, così compariranno tutti i primi classificati a pari merito. Esplicitare questa scelta dimostra che comprende la differenza.
WITH sales AS (
SELECT p.category,
p.name AS product,
SUM(oi.quantity) AS qty
FROM order_items oi
JOIN products p ON p.id = oi.product_id
GROUP BY p.category, p.name
)
SELECT category, product, qty
FROM (
SELECT s.*,
ROW_NUMBER() OVER (
PARTITION BY category ORDER BY qty DESC
) AS rn
FROM sales s
) r
WHERE rn = 1;Problema 7: totale progressivo dei ricavi
"Mostri il totale progressivo (cumulativo) dei ricavi pagati per giorno." Una funzione finestra SUM con una cornice ordinata produce il totale progressivo senza un self-join.
Citi la cornice ROWS per ottenere un vero cumulativo riga per riga; la cornice RANGE predefinita può comportarsi in modo imprevisto con date a pari merito.
SELECT order_date,
SUM(daily) OVER (
ORDER BY order_date
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) AS running_total
FROM (
SELECT order_date, SUM(amount) AS daily
FROM orders
WHERE status = 'paid'
GROUP BY order_date
) d
ORDER BY order_date;Problema 8: giorni attivi consecutivi
"Trovi gli utenti con almeno 3 giorni consecutivi contenenti un ordine pagato." È una variante del problema gaps-and-islands che usa la tecnica della differenza dei numeri di riga.
Sottraendo il numero di riga per ciascun utente dalla data si ottiene una costante all'interno di una sequenza consecutiva; quindi si raggruppa per quella costante e si conta. È un segnale di livello senior.
WITH days AS (
SELECT DISTINCT customer_id, order_date
FROM orders WHERE status = 'paid'
),
grp AS (
SELECT customer_id, order_date,
order_date - (ROW_NUMBER() OVER (
PARTITION BY customer_id ORDER BY order_date
) * INTERVAL '1 day') AS island
FROM days
)
SELECT customer_id, COUNT(*) AS streak_len
FROM grp
GROUP BY customer_id, island
HAVING COUNT(*) >= 3;Prestazioni e problemi comuni
Dopo una query corretta, gli intervistatori chiedono "come la renderebbe più veloce?" e cercano le trappole classiche. Tenga pronta questa checklist:
- Indicizzi le colonne usate per join e filtri (ad esempio
orders(customer_id, status)); eviti le funzioni sulle colonne indicizzate nella clausola WHERE. - Preferisca EXISTS a IN per gli anti-join di grandi dimensioni;
NOT INcon un NULL restituisce silenziosamente zero righe. - Filtrare in WHERE una colonna sottoposta a outer join la trasforma silenziosamente in un inner join.
- Aggiunga sempre un criterio di spareggio, così i risultati top-N sono deterministici.
- Controlli il piano EXPLAIN per individuare scansioni sequenziali sulle tabelle grandi.
Verifica rapida
Deve ottenere l'unico ordine più recente di ciascun cliente e due ordini possono avere la stessa data.
Riepilogo: serie completa di simulazioni di colloquio
Ha affrontato dall'inizio alla fine i problemi di colloquio più frequenti:
- Aggregazione + LIMIT per la spesa top-N.
- Anti-join con NOT EXISTS (a prova di NULL).
- DENSE_RANK per l'ennesimo valore più alto, ROW_NUMBER per l'ultima riga per chiave e il valore principale per gruppo.
- LAG per il confronto mese su mese, SUM OVER per i totali progressivi.
- La tecnica dei numeri di riga per i problemi gaps-and-islands e le sequenze consecutive.
- Concluda ogni risposta discutendo di indici, EXPLAIN e problemi comuni.
Domande Frequenti
La lezione «Serie completa di problemi per una simulazione di colloquio» è gratuita?
Sì — il testo completo di «Serie completa di problemi per una simulazione di colloquio» è 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 Coding Interview Prep, passa a CoddyKit PRO. Il corso Coding Interview Prep include 4 lezioni in totale.
Cosa imparerò in «Serie completa di problemi per una simulazione di colloquio»?
Problemi completi da risolvere a tempo, che combinano join, funzioni finestra e CTE in condizioni simili a un colloquio. Eserciti Coding 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 Coding Interview Prep?
Non è richiesta alcuna esperienza precedente. Coding 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 4 di 4.
Quanto tempo richiede la lezione «Serie completa di problemi per una simulazione di colloquio»?
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 Coding Interview Prep?
Sì. Ogni lezione Coding 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
- Normalizzazione fino alla 3NF
- Modellazione ER e cardinalità delle relazioni
- Schema a stella e progettazione del data warehouse
- Serie completa di problemi per una simulazione di colloquio