Kumulativ fördelning och andel av totalen
Beräkna löpande procentandelar och andel av totalen inom partitioner
Kumulativ fördelning och andel av totalen är en gratis lektion i Förberedelse inför kodningsintervjuer på CoddyKit. Detta är lektion 4 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Förberedelse inför kodningsintervjuer, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Förberedelse inför kodningsintervjuer innehåller totalt 4 lektioner.
Frågan om andel av totalsumman
En standardfråga i rapporteringsintervjuer är: "Hur stor procentandel av de totala intäkterna står varje kategori för?" och den kumulativa motsvarigheten "Hur stor är den löpande andelen av totalsumman?"
Tricket är att dividera varje rads värde med ett fönsteraggregat som beräknas över hela partitionen. Insikten som testas är att Ni kan lägga in en totalsumma i en fönsterfunktion utan att behöva en self-join.
Window SUM utan ORDER BY = totalsumma
Här är det centrala greppet: SUM(amount) OVER () med ett tomt OVER och utan ORDER BY returnerar totalsumman för hela resultatuppsättningen, upprepad på varje rad.
Eftersom det saknas en ORDER BY finns ingen löpande ram, så standardramen är hela partitionen. Denna totalsumma på varje rad är exakt den nämnare Ni behöver för en andel av totalsumman.
SELECT
category,
amount,
SUM(amount) OVER () AS grand_total
FROM category_sales;Beräkna andel av totalsumman
Dividera radens värde med totalsumman från fönsterfunktionen och multiplicera med 100. Omvandla till ett decimaltal så att heltalsdivision inte trunkerar resultatet till noll.
Denna fråga i ett enda steg ersätter det äldre mönstret med en underfråga för totalsumman som sedan kopplas tillbaka till detaljraderna. Den är kortare, snabbare och lättläst.
SELECT
category,
amount,
ROUND(
100.0 * amount / SUM(amount) OVER (),
2
) AS pct_of_total
FROM category_sales;Fallgropen med heltalsdivision
En klassisk intervjufälla: i många databaser utför amount / total på heltalskolumner heltalsdivision, så ett resultat som är mindre än 1 blir 0.
Rätta till detta genom att först multiplicera med 100.0 (ett numeriskt literalvärde) eller genom att omvandla den ena operanden: amount::numeric / total. Om Ni glömmer detta får Ni en kolumn med nollor, vilket intervjuare upptäcker direkt.
SELECT
category,
amount * 1.0 / SUM(amount) OVER () AS share,
CAST(amount AS DECIMAL) / SUM(amount) OVER () AS share_alt
FROM category_sales;Andel av totalsumman inom en grupp
Lägg till PARTITION BY så att varje rads andel beräknas i förhållande till dess grupp i stället för hela tabellen. Till exempel varje produkts procentandel av försäljningen i sin egen region.
Nämnaren SUM(amount) OVER (PARTITION BY region) återställs nu per region, så att procentandelarna inom varje region summerar till 100.
SELECT
region,
product,
amount,
ROUND(
100.0 * amount / SUM(amount) OVER (PARTITION BY region),
2
) AS pct_of_region
FROM regional_sales;Löpande andel av totalsumman
Kombinera en kumulativ täljare med en fast nämnare för att få en löpande andel av totalsumman: hur stor del av totalsumman som har ackumulerats fram till varje rad.
Täljaren använder ORDER BY (kumulativ), medan nämnaren använder ett tomt OVER () (totalsumma). Den sista 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 fördelning
SQL har en inbyggd funktion för kumulativ fördelning: CUME_DIST(). Den returnerar andelen rader vars ORDER BY-värde är mindre än eller lika med värdet på den aktuella raden, ett tal i intervallet (0, 1].
Till skillnad från en manuellt beräknad löpande andel av ett belopp handlar CUME_DIST om radens position och besvarar frågan "vilken andel av raderna ligger på eller under detta värde?" Det är användbart i rapporter av percentiltyp.
SELECT
score,
CUME_DIST() OVER (ORDER BY score) AS cume_dist
FROM exam_results;PERCENT_RANK och skillnaden mot CUME_DIST
En närbesläktad funktion är PERCENT_RANK(), som definieras som (rank - 1) / (total_rows - 1) och ger värden från 0 till 1.
Skillnaden som är viktig i en intervju är att CUME_DIST inkluderar den aktuella raden i sin täljare ("på eller under"), medan PERCENT_RANK är en relativ rangordning som börjar på 0 för den första raden. De ger olika värden, och det är vanligt att blanda ihop dem.
SELECT
score,
CUME_DIST() OVER (ORDER BY score) AS cd,
PERCENT_RANK() OVER (ORDER BY score) AS pr
FROM exam_results;Pareto- eller 80/20-analys
Löpande andel av totalsumman möjliggör Paretoanalys: "vilka av de största kunderna står för 80 % av intäkterna?" Sortera fallande efter belopp, beräkna den löpande andelen och filtrera sedan där den kumulativa andelen för första gången passerar 80 %.
Eftersom fönsterresultat inte kan användas i WHERE ska Ni placera beräkningen i en CTE och filtrera i den yttre frågan, enligt samma regel som gäller för alla fönsterfunktioner.
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;Avrundning och avstämning
Observera: om varje procenttal avrundas till 2 decimaler kan kolumnens summa bli 99.99 eller 100.01 i stället för exakt 100. Vid intervjuer kan frågan komma upp hur man garanterar att delarna summerar till helheten.
Vanliga svar är: avrunda endast vid visning, behåll full precision i beräkningarna eller justera en rad med metoden largest remainder. Att kunna identifiera problemet är viktigare än att ange den perfekta lösningen.
Viktiga punkter från intervjun
Viktiga slutsatser att kunna uttrycka:
SUM(x) OVER ()utan ORDER BY = totalsumman på varje rad.- Multiplicera med
100.0för att undvika heltalsdivision. PARTITION BYför andelar per grupp.- En kumulativ täljare över en nämnare som är totalsumman = en löpande andel.
CUME_DISTochPERCENT_RANKför fördelningar; känn till skillnaden mellan dem.- Använd en CTE för Pareto- eller tröskelfiltrering.
Snabbtest
Hur får man totalsumman för hela resultatmängden på varje rad?
Sammanfattning: fördelning och procentandel av totalen
Procentandel av totalen beräknas genom att dividera radens värde med SUM(x) OVER (), totalsumman som returneras på varje rad; multiplicera alltid med 100.0 för att undvika heltalsdivision och lägg till PARTITION BY för andelar per grupp. En kumulativ täljare över en nämnare som är totalsumman ger en löpande andel som slutar på 100 %, vilket är grunden för Paretoanalys.
För positionsbaserad fördelning använder man CUME_DIST och PERCENT_RANK, och kommer ihåg reservationen kring avrundning och avstämning. Därmed är löpande totalsummor och glidande medelvärden klara.
Lär dig Förberedelse inför kodningsintervjuer med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 90
- Lektioner
- 360
Vanliga frågor
Är lektionen ”Kumulativ fördelning och andel av totalen” gratis?
Ja – hela texten till ”Kumulativ fördelning och andel av totalen” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Förberedelse inför kodningsintervjuer, kan Ni uppgradera till CoddyKit PRO. Kursen i Förberedelse inför kodningsintervjuer innehåller totalt 4 lektioner.
Vad lär jag mig i ”Kumulativ fördelning och andel av totalen”?
Beräkna löpande procentandelar och andel av totalen inom partitioner Ni övar på Förberedelse inför kodningsintervjuer med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Förberedelse inför kodningsintervjuer?
Du behöver inga förkunskaper. Utbildningen i Förberedelse inför kodningsintervjuer på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.
Hur lång tid tar lektionen ”Kumulativ fördelning och andel av totalen”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Förberedelse inför kodningsintervjuer-lektionen?
Ja. Varje Förberedelse inför kodningsintervjuer-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Kumulativa summor med fönsterramar
- ROWS kontra RANGE som ram
- Glidande medelvärden över ett rullande fönster
- Kumulativ fördelning och andel av totalen