Distribuzione cumulativa e percentuale del totale
Calcolare percentuali progressive e quote del totale all'interno delle partizioni
Distribuzione cumulativa e percentuale del totale è 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.
La domanda sulla percentuale del totale
Una domanda ricorrente nei colloqui sulla reportistica è: "Quale percentuale dei ricavi totali rappresenta ogni categoria?", insieme alla sua versione cumulativa: "Qual è la quota cumulativa del totale?"
Il punto chiave è dividere il valore di ogni riga per un aggregato di finestra calcolato sull'intera partizione. La competenza verificata consiste nel sapere che è possibile inserire un totale generale in una funzione finestra, senza ricorrere a un self-join.
SUM su finestra senza ORDER BY = totale generale
Ecco la tecnica fondamentale: SUM(amount) OVER (), con un OVER vuoto e senza ORDER BY, restituisce il totale dell'intero set di risultati, ripetuto in ogni riga.
Poiché non è presente ORDER BY, non esiste un frame progressivo, quindi il frame predefinito è l'intera partizione. Avere il totale in ogni riga fornisce esattamente il denominatore necessario per calcolare la percentuale del totale.
SELECT
category,
amount,
SUM(amount) OVER () AS grand_total
FROM category_sales;Calcolare la percentuale del totale
Divida il valore della riga per il totale generale calcolato dalla funzione finestra e moltiplichi per 100. Esegua il cast a un tipo decimale, così la divisione intera non verrà troncata a zero.
Questa query a passaggio singolo sostituisce il vecchio schema con una sottoquery per il totale, unita nuovamente alle righe di dettaglio. È più breve, più veloce e più leggibile.
SELECT
category,
amount,
ROUND(
100.0 * amount / SUM(amount) OVER (),
2
) AS pct_of_total
FROM category_sales;L'insidia della divisione intera
Un classico tranello da colloquio: in molti database amount / total su colonne intere esegue una divisione intera, quindi un risultato inferiore a 1 diventa 0.
Risolva il problema moltiplicando prima per 100.0 (un valore letterale numerico) oppure eseguendo il cast di uno degli operandi: amount::numeric / total. Dimenticarsene restituisce una colonna di zeri, cosa che gli intervistatori notano immediatamente.
SELECT
category,
amount * 1.0 / SUM(amount) OVER () AS share,
CAST(amount AS DECIMAL) / SUM(amount) OVER () AS share_alt
FROM category_sales;Percentuale del totale all'interno di un gruppo
Aggiunga PARTITION BY per rendere la quota di ogni riga relativa al proprio gruppo anziché all'intera tabella. Ad esempio, la percentuale delle vendite di ogni prodotto rispetto alle vendite della propria regione.
Il denominatore SUM(amount) OVER (PARTITION BY region) ora riparte per ogni regione, quindi le percentuali all'interno di ciascuna regione raggiungono complessivamente il 100%.
SELECT
region,
product,
amount,
ROUND(
100.0 * amount / SUM(amount) OVER (PARTITION BY region),
2
) AS pct_of_region
FROM regional_sales;Percentuale cumulativa del totale
Combini un numeratore cumulativo con un denominatore fisso per ottenere la quota cumulativa del totale: la parte del totale generale accumulata fino a ogni riga.
Il numeratore utilizza ORDER BY (cumulativo), mentre il denominatore utilizza un OVER () vuoto (totale generale). L'ultima riga raggiunge sempre il 100%.
SELECT
sale_date,
amount,
ROUND(
100.0 * SUM(amount) OVER (ORDER BY sale_date)
/ SUM(amount) OVER (),
2
) AS running_pct
FROM daily_sales;CUME_DIST: distribuzione cumulativa
SQL dispone di una funzione integrata per la distribuzione cumulativa: CUME_DIST(). Restituisce la frazione di righe con un valore di ORDER BY minore o uguale a quello della riga corrente, un numero nell'intervallo (0, 1].
A differenza di una quota cumulativa calcolata manualmente su un importo, CUME_DIST riguarda la posizione della riga e risponde alla domanda "quale proporzione di righe ha un valore inferiore o uguale a questo?" È utile per la reportistica in stile percentile.
SELECT
score,
CUME_DIST() OVER (ORDER BY score) AS cume_dist
FROM exam_results;PERCENT_RANK e la sua differenza
Una funzione strettamente correlata è PERCENT_RANK(), definita come (rank - 1) / (total_rows - 1), con valori compresi tra 0 e 1.
La distinzione importante in un colloquio è questa: CUME_DIST include la riga corrente nel numeratore ("inferiore o uguale"), mentre PERCENT_RANK rappresenta il rango relativo e parte da 0 per la prima riga. Le due funzioni restituiscono valori diversi e confonderle è un errore comune.
SELECT
score,
CUME_DIST() OVER (ORDER BY score) AS cd,
PERCENT_RANK() OVER (ORDER BY score) AS pr
FROM exam_results;Analisi di Pareto / 80-20
La percentuale cumulativa del totale consente di eseguire l'analisi di Pareto: "quali clienti principali rappresentano l'80% dei ricavi?" Ordini in modo decrescente per amount, calcoli la quota cumulativa e poi filtri le righe in cui la quota cumulativa supera per la prima volta l'80%.
Poiché i risultati delle funzioni finestra non possono essere inseriti in WHERE, racchiuda il calcolo in una CTE ed esegua il filtro nella query esterna, secondo la stessa regola che vale per tutte le funzioni finestra.
WITH ranked AS (
SELECT
customer_id,
revenue,
SUM(revenue) OVER (ORDER BY revenue DESC)
/ SUM(revenue) OVER () AS running_share
FROM customer_revenue
)
SELECT *
FROM ranked
WHERE running_share <= 0.80;Arrotondamento e riconciliazione
Attenzione: arrotondare ogni percentuale a 2 decimali può far sì che la somma della colonna sia 99.99 o 100.01 invece di essere esattamente 100. In un colloquio potrebbe esserLe chiesto come garantire che la somma delle parti corrisponda al totale.
Le risposte più comuni sono: arrotondare solo per la visualizzazione, mantenere la precisione completa per i calcoli oppure applicare un aggiustamento con il metodo del resto maggiore a una riga. È più importante saper individuare il problema che conoscere la soluzione specifica.
Punti chiave per il colloquio
Punti chiave da esporre a voce:
SUM(x) OVER ()senza ORDER BY = totale complessivo su ogni riga.- Moltiplicare per
100.0per evitare la divisione intera. PARTITION BYper ottenere le percentuali all'interno di ogni gruppo.- Numeratore cumulativo diviso per un denominatore pari al totale complessivo = percentuale cumulativa.
CUME_DISTePERCENT_RANKper la distribuzione; è importante conoscerne le differenze.- Racchiudere la query in una CTE per i filtri Pareto o basati su soglie.
Verifica rapida
Come si ottiene il totale complessivo dell'intero set di risultati su ogni riga?
Riepilogo: distribuzione e percentuale del totale
La percentuale del totale si ottiene dividendo il valore di una riga per SUM(x) OVER (), il totale complessivo restituito su ogni riga; moltiplichi sempre per 100.0 per evitare la divisione intera e aggiunga PARTITION BY per ottenere le percentuali all'interno dei gruppi. Un numeratore cumulativo diviso per un denominatore pari al totale complessivo produce una percentuale cumulativa che termina al 100%, alla base dell'analisi di Pareto.
Per la distribuzione basata sulla posizione, utilizzi CUME_DIST e PERCENT_RANK e ricordi la questione della riconciliazione degli arrotondamenti. In questo modo si completano i totali cumulativi e le medie mobili.
Domande Frequenti
La lezione «Distribuzione cumulativa e percentuale del totale» è gratuita?
Sì — il testo completo di «Distribuzione cumulativa e percentuale del totale» è 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 «Distribuzione cumulativa e percentuale del totale»?
Calcolare percentuali progressive e quote del totale all'interno delle partizioni 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 «Distribuzione cumulativa e percentuale del totale»?
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
- Somme cumulative con i frame di finestra
- Frame ROWS e RANGE
- Medie mobili su una finestra scorrevole
- Distribuzione cumulativa e percentuale del totale