Contare e filtrare i gruppi
Trovare i gruppi che soddisfano una soglia: la domanda classica sui clienti con più di N ordini
Contare e filtrare i gruppi è una lezione SQL 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 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 più comune sul raggruppamento
«Trovare i clienti con più di N ordini» è il problema classico sui GROUP BY nei colloqui. Le varianti sono frequentissime: prodotti venduti più di X volte, reparti con almeno Y dipendenti, giorni con oltre Z accessi.
Il modello è sempre lo stesso: raggruppare, contare e poi filtrare i gruppi con HAVING.
Primo passaggio: contare per gruppo
Inizi contando le righe all'interno di ciascun gruppo. Raggruppi per la chiave che definisce un «cliente» o un «prodotto», quindi applichi COUNT(*).
Ottiene così una riga per ogni gruppo con la relativa dimensione. Non ha ancora applicato alcun filtro: sta semplicemente misurando ogni gruppo.
SELECT customer_id, COUNT(*) AS order_count
FROM orders
GROUP BY customer_id;Secondo passaggio: filtrare con HAVING
A questo punto mantenga solo i gruppi che raggiungono la soglia. La condizione riguarda un aggregato, quindi deve trovarsi in HAVING, non in WHERE.
La si può leggere così: «raggruppi gli ordini per cliente, poi mantenga i clienti il cui conteggio supera cinque». Questa è la risposta completa alla richiesta classica.
SELECT customer_id, COUNT(*) AS order_count
FROM orders
GROUP BY customer_id
HAVING COUNT(*) > 5;Contare i distinti rispetto a contare tutti
Presti attenzione alla formulazione. «Clienti che hanno ordinato più di 3 prodotti diversi» richiede COUNT(DISTINCT product_id), non COUNT(*).
COUNT(*)conta le righe del gruppo.COUNT(DISTINCT col)conta i valori non NULL unici.
Gli intervistatori inseriscono «diversi» o «unici» nella richiesta per verificare se ricorre a DISTINCT.
SELECT customer_id, COUNT(DISTINCT product_id) AS distinct_products
FROM orders
GROUP BY customer_id
HAVING COUNT(DISTINCT product_id) > 3;Filtrare su SUM invece che su COUNT
La stessa struttura gestisce le somme. «Clienti che hanno speso complessivamente più di 1000» raggruppa per cliente e filtra su SUM(amount).
Qualsiasi aggregato può determinare la condizione di HAVING: COUNT, SUM, AVG, MAX, MIN. Riconoscere la misura richiesta indica su quale aggregato applicare il filtro.
SELECT customer_id, SUM(amount) AS total_spent
FROM orders
GROUP BY customer_id
HAVING SUM(amount) > 1000;Più condizioni sui gruppi
HAVING può combinare condizioni con AND/OR, anche riferite ad aggregati diversi. «Clienti con più di 5 ordini E una media per ordine superiore a 100» è una singola clausola HAVING.
Ogni condizione fa riferimento al proprio aggregato; tutte vengono valutate dopo il raggruppamento. Questo dimostra che sa esprimere con chiarezza regole aziendali composte.
SELECT customer_id,
COUNT(*) AS orders,
AVG(amount) AS avg_order
FROM orders
GROUP BY customer_id
HAVING COUNT(*) > 5 AND AVG(amount) > 100;Combinare WHERE e HAVING
Spesso è necessario filtrare le righe prima di contarle. «Tra gli ordini di quest'anno, trovare i clienti con più di 5 ordini» utilizza WHERE per la data e HAVING per il conteggio.
WHERE riduce prima l'insieme di righe, poi vengono applicati il raggruppamento e la soglia di HAVING. Usare correttamente entrambe le clausole in un'unica query è un segnale di competenza intermedia.
SELECT customer_id, COUNT(*) AS orders_this_year
FROM orders
WHERE order_date >= '2024-01-01'
GROUP BY customer_id
HAVING COUNT(*) > 5;Individuazione dei duplicati
Un caso molto simile è «trovare le email duplicate». Raggruppi per la colonna che dovrebbe essere univoca e mantenga i gruppi con un conteggio superiore a uno.
Questo singolo modello individua chiavi duplicate, transazioni ripetute o qualsiasi valore che compare più volte del previsto. Nei colloqui viene chiesto per verificare se considera il raggruppamento anche uno strumento di deduplicazione.
SELECT email, COUNT(*) AS times_seen
FROM users
GROUP BY email
HAVING COUNT(*) > 1;Gruppi con un conteggio esatto
Le soglie non sono sempre «maggiore di». «Clienti con esattamente un ordine» usa HAVING COUNT(*) = 1; «almeno 3» usa >= 3.
Presti attenzione alla parola che indica il limite nella richiesta: «più di», «almeno», «esattamente», «meno di». Ognuna corrisponde a un diverso operatore di confronto, e gli intervistatori verificano questa precisione.
-- One-time customers
SELECT customer_id, COUNT(*) AS orders
FROM orders
GROUP BY customer_id
HAVING COUNT(*) = 1;Restituire solo le chiavi
A volte la richiesta vuole solo gli identificatori che soddisfano i requisiti, non i conteggi, spesso per usarli in un'altra query. Si raggruppano e filtrano comunque i dati, ma si seleziona solo la chiave.
È quindi possibile racchiudere il risultato in una sottoquery IN o usare un join per recuperare tutti i record di quei clienti. Saper comporre queste soluzioni dimostra esperienza.
SELECT customer_id
FROM orders
GROUP BY customer_id
HAVING COUNT(*) > 5;Strategia per il colloquio
Per qualsiasi domanda sui gruppi che soddisfano una soglia, descriva ad alta voce questi quattro passaggi: (1) identifichi la chiave di raggruppamento, (2) scelga la misura aggregata, (3) determini l'operatore di confronto in base alla formulazione, (4) inserisca i filtri sulle righe in WHERE e il filtro sull'aggregato in HAVING.
Questa struttura risolve l'intera famiglia di problemi di conteggio e filtraggio.
Verifica rapida
Scelga la query corretta per la richiesta.
Riepilogo
Schema: raggruppi per chiave, calcoli l'aggregato e filtri i gruppi con HAVING. Questo risolve i casi con «più di N ordini», i clienti che spendono di più, i duplicati e i clienti con un solo acquisto.
- Usi
COUNT(*)per le righe eCOUNT(DISTINCT col)per i valori univoci. - Faccia corrispondere l'operatore di confronto alla formulazione della richiesta.
- I filtri sulle righe vanno in WHERE, quelli sugli aggregati in HAVING.
- Selezioni solo la chiave per alimentare una sottoquery
INo un join.
Domande Frequenti
La lezione «Contare e filtrare i gruppi» è gratuita?
Sì — il testo completo di «Contare e filtrare i gruppi» è 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 «Contare e filtrare i gruppi»?
Trovare i gruppi che soddisfano una soglia: la domanda classica sui clienti con più di N ordini 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 4 di 4.
Quanto tempo richiede la lezione «Contare e filtrare i gruppi»?
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
- La regola di GROUP BY per le colonne SELECT
- HAVING e WHERE
- Raggruppare per più colonne ed espressioni
- Contare e filtrare i gruppi