Kumulativ fordeling og andel av totalen
Beregn løpende prosenter og andel av totalen innenfor partisjoner.
Kumulativ fordeling og andel av totalen er en gratis leksjon i Forberedelse til kodeintervjuer på CoddyKit. Dette er leksjon 4 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Forberedelse til kodeintervjuer, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Forberedelse til kodeintervjuer inneholder totalt 4 leksjoner.
Spørsmålet om prosent av totalen
Et vanlig spørsmål i rapporteringsintervjuer er: «Hvor stor prosentandel av de totale inntektene representerer hver kategori?», og den kumulative varianten: «Hva er den løpende andelen av totalen?»
Trikset er å dele hver rads verdi på en vindusaggregasjon som beregnes over hele partisjonen. Innsikten som testes, er at De kan legge en totalsum i en vindusfunksjon uten å trenge en self-join.
Window SUM uten ORDER BY = totalsum
Her er det viktigste grepet: SUM(amount) OVER () med en tom OVER og uten ORDER BY returnerer totalen for hele resultatsettet, gjentatt på hver rad.
Fordi det ikke finnes noen ORDER BY, finnes det ingen løpende ramme, og standardrammen er derfor hele partisjonen. Denne totalen på hver rad er nettopp nevneren De trenger for prosent av totalen.
SELECT
category,
amount,
SUM(amount) OVER () AS grand_total
FROM category_sales;Beregne prosent av totalen
Del radens verdi på totalsummen fra vindusfunksjonen, og multipliser med 100. Konverter til et desimaltall slik at heltallsdivisjon ikke avrunder resultatet til null.
Denne spørringen i ett gjennomløp erstatter det gamle mønsteret med en underspørring for totalen som kobles tilbake til detaljradene. Den er kortere, raskere og lett å lese.
SELECT
category,
amount,
ROUND(
100.0 * amount / SUM(amount) OVER (),
2
) AS pct_of_total
FROM category_sales;Fellen med heltallsdivisjon
En klassisk intervjufelle: I mange databaser utfører amount / total på heltallskolonner heltallsdivisjon, slik at et resultat mindre enn 1 blir 0.
Rett dette ved å multiplisere med 100.0 (en numerisk konstant) først, eller ved å konvertere én operand: amount::numeric / total. Hvis De glemmer dette, får De en kolonne med nuller, noe intervjuere oppdager umiddelbart.
SELECT
category,
amount * 1.0 / SUM(amount) OVER () AS share,
CAST(amount AS DECIMAL) / SUM(amount) OVER () AS share_alt
FROM category_sales;Prosent av totalen innenfor en gruppe
Legg til PARTITION BY for å gjøre hver rads andel relativ til gruppen i stedet for hele tabellen. For eksempel kan De beregne hvert produkts prosentandel av salget i sin egen region.
Nevneren SUM(amount) OVER (PARTITION BY region) tilbakestilles nå per region, slik at prosentandelene innenfor hver region summerer seg til 100.
SELECT
region,
product,
amount,
ROUND(
100.0 * amount / SUM(amount) OVER (PARTITION BY region),
2
) AS pct_of_region
FROM regional_sales;Løpende prosent av totalen
Kombiner en kumulativ teller med en fast nevner for å få en løpende andel av totalen: hvor mye av totalsummen som er samlet opp til hver rad.
Telleren bruker ORDER BY (kumulativ), mens nevneren bruker en tom OVER () (totalsum). Den siste raden når alltid 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: Kumulativ fordeling
SQL har en innebygd funksjon for kumulativ fordeling: CUME_DIST(). Den returnerer andelen rader med en ORDER BY-verdi som er mindre enn eller lik verdien på den gjeldende raden, som et tall i (0, 1].
I motsetning til en manuelt beregnet løpende andel av et beløp handler CUME_DIST om radens plassering og besvarer spørsmålet «hvilken andel av radene ligger på eller under denne verdien?». Dette er nyttig i rapporter av typen persentil.
SELECT
score,
CUME_DIST() OVER (ORDER BY score) AS cume_dist
FROM exam_results;PERCENT_RANK og forskjellen
En nær slektning er PERCENT_RANK(), definert som (rank - 1) / (total_rows - 1), med verdier fra 0 til 1.
Forskjellen som er viktig i intervjuet, er at CUME_DIST inkluderer den gjeldende raden i telleren («på eller under»), mens PERCENT_RANK er en relativ rangering som starter på 0 for den første raden. De gir ulike verdier, og det er vanlig å forveksle dem.
SELECT
score,
CUME_DIST() OVER (ORDER BY score) AS cd,
PERCENT_RANK() OVER (ORDER BY score) AS pr
FROM exam_results;Pareto-/80–20-analyse
Løpende prosent av totalen gjør Pareto-analyse mulig: «Hvilke av de største kundene står for 80 % av inntektene?» Sorter synkende etter beløp, beregn den løpende andelen, og filtrer der den kumulative andelen først passerer 80 %.
Fordi vindusresultater ikke kan brukes i WHERE, legger De beregningen i en CTE og filtrerer i den ytre spørringen – den samme regelen som gjelder for alle vindusfunksjoner.
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;Avrunding og avstemming
Vær oppmerksom på at hvis hver prosentandel rundes av til to desimaler, kan summen av kolonnen bli 99.99 eller 100.01 i stedet for nøyaktig 100. Intervjuere kan spørre hvordan man sikrer at delene summerer seg til helheten.
Vanlige svar er å bare avrunde ved visning, beholde full presisjon i beregningene eller bruke en justering etter største rest på én rad. Det er viktigere å nevne problemet enn å kunne presentere løsningen.
Viktige punkter å forklare muntlig
Viktige poenger å forklare muntlig:
SUM(x) OVER ()uten ORDER BY = totalsummen på hver rad.- Multipliser med
100.0for å unngå heltallsdivisjon. PARTITION BYfor andeler per gruppe.- Kumulativ teller over en nevner med totalsummen = løpende andel.
CUME_DISTogPERCENT_RANKfor fordeling; kjenn forskjellen på dem.- Pakk inn i en CTE for Pareto-/terskelfiltrering.
Hurtigsjekk
Hvordan får man totalsummen for hele resultatsettet på hver rad?
Oppsummering: Fordeling og prosent av totalen
Prosent av totalen deler en radverdi på SUM(x) OVER (), totalsummen som returneres på hver rad. Multipliser alltid med 100.0 for å unngå heltallsdivisjon, og legg til PARTITION BY for andeler per gruppe. En kumulativ teller over en nevner med totalsummen gir en løpende andel som ender på 100 %, og er grunnlaget for Pareto-analyse.
For posisjonsbasert fordeling bruker man CUME_DIST og PERCENT_RANK, og bør huske forbeholdet om avrundingsavstemming. Da er gjennomgangen av løpende totaler og glidende gjennomsnitt fullført.
Lær deg Forberedelse til kodeintervjuer med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 90
- Leksjoner
- 360
Ofte stilte spørsmål
Er leksjonen «Kumulativ fordeling og andel av totalen» gratis?
Ja – hele teksten i «Kumulativ fordeling og andel av totalen» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Forberedelse til kodeintervjuer-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Forberedelse til kodeintervjuer inneholder totalt 4 leksjoner.
Hva lærer jeg i «Kumulativ fordeling og andel av totalen»?
Beregn løpende prosenter og andel av totalen innenfor partisjoner. Du øver på Forberedelse til kodeintervjuer med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Forberedelse til kodeintervjuer?
Ingen tidligere erfaring er nødvendig. Forberedelse til kodeintervjuer på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.
Hvor lang tid tar leksjonen «Kumulativ fordeling og andel av totalen»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Forberedelse til kodeintervjuer-leksjonen?
Ja. Alle Forberedelse til kodeintervjuer-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Kumulative summer med window-rammer
- ROWS versus RANGE som rammetyper
- Glidende gjennomsnitt over et bevegelig vindu
- Kumulativ fordeling og andel av totalen