Förberedelser inför SQL-intervjun · Lektion

Glidande medelvärden över ett rullande fönster

Beräkna rullande medelvärden för N perioder med BETWEEN PRECEDING AND CURRENT ROW

Lektion 3 av 413 steg

Glidande medelvärden över ett rullande fönster är en gratis lektion i Förberedelser inför SQL-intervjun på CoddyKit. Detta är lektion 3 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örberedelser inför SQL-intervjun, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Förberedelser inför SQL-intervjun innehåller totalt 4 lektioner.

Frågan om glidande medelvärde

Analytiker får ständigt denna fråga: "Beräkna ett glidande medelvärde för intäkterna över 7 dagar." Ett glidande medelvärde jämnar ut brusiga dagliga data genom att beräkna medelvärdet av varje punkt tillsammans med dess närmaste föregångare.

Det intervjumässigt starka svaret är en fönsterbaserad AVG med en uttrycklig glidande ram. Den viktiga färdigheten är att välja ramens gränser så att fönstret förflyttas korrekt längs sorteringsordningen.

Grundmönstret

Ett glidande medelvärde är AVG(value) OVER (ORDER BY ... ROWS BETWEEN n PRECEDING AND CURRENT ROW). Ramen förflyttas: vid varje rad omfattar den den aktuella raden och de n föregående raderna.

För ett sjudagarsfönster över dagliga rader går Ni tillbaka 6 rader och tar med den aktuella raden, vilket ger totalt 7 rader. Ett fel med en för mycket eller för lite är det vanligaste misstaget som intervjuare upptäcker.

SELECT
  sale_date,
  amount,
  AVG(amount) OVER (
    ORDER BY sale_date
    ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
  ) AS moving_avg_7d
FROM daily_sales;

Så räknar Ni fönsterstorleken korrekt

Fönsterstorleken är lika med preceding + 1 (där +1 är den aktuella raden). Alltså:

  • Fönster med 3 rader: ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
  • Fönster med 7 rader: ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
  • Fönster med 30 rader: ROWS BETWEEN 29 PRECEDING AND CURRENT ROW

Säg denna aritmetik högt på en intervju så ser panelen att Ni resonerar medvetet och inte gissar.

Bakåtblickande jämfört med centrerade fönster

Exemplet ovan är ett bakåtblickande medelvärde: det tittar bara bakåt och är därför kausalt och säkert för prognosbaserade dashboards.

Ett centrerat medelvärde tittar åt båda hållen, till exempel ROWS BETWEEN 3 PRECEDING AND 3 FOLLOWING för ett centrerat fönster med 7 rader. Centrerade fönster jämnar ut mer symmetriskt, men kan inte beräknas för de allra senaste raderna i realtid. Nämn vilket alternativ användningsfallet kräver.

SELECT
  sale_date,
  AVG(amount) OVER (
    ORDER BY sale_date
    ROWS BETWEEN 3 PRECEDING AND 3 FOLLOWING
  ) AS centered_avg_7
FROM daily_sales;

Effekten vid fönstrets kant

Allra i början av datan finns inte hela fönstret ännu. För rad 1 i ett bakåtblickande sjudagarsmedelvärde finns bara 1 rad tillgänglig, så AVG beräknar medelvärdet av endast det värdet.

Det innebär att de tidiga raderna visar ett "uppvärmningsmedelvärde" som bygger på färre rader. Intervjuare frågar ofta hur detta ska hanteras. Det finns två alternativ: acceptera det partiella fönstret eller dölja de tidiga raderna genom att kräva ett fullständigt antal.

Dölja partiella fönster

Om verksamheten vill ha NULL tills ett fullständigt fönster är tillgängligt kan Ni använda COUNT(*) över samma ram och ersätta korta fönster med ett tomt värde med hjälp av ett CASE-uttryck.

Detta är en genomarbetad detalj som visar att Ni har tänkt på korrekthet vid gränserna, något många kandidater missar.

SELECT
  sale_date,
  CASE WHEN COUNT(*) OVER w = 7
       THEN AVG(amount) OVER w
  END AS moving_avg_7d
FROM daily_sales
WINDOW w AS (
  ORDER BY sale_date
  ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
);

Återanvända en ram med WINDOW

Den föregående frågan använde en namngiven WINDOW-sats. När samma ram förekommer flera gånger kan Ni definiera den en gång som WINDOW w AS (...) och hänvisa till OVER w. Det håller frågan DRY och lättläst.

Postgres, MySQL 8 och SQL Server stöder namngivna fönster. Att använda ett sådant i en intervju signalerar en djupare förståelse än att bara kopiera och klistra in fönsterfunktioner.

SELECT
  sale_date,
  AVG(amount) OVER w AS avg_7d,
  SUM(amount) OVER w AS sum_7d
FROM daily_sales
WINDOW w AS (
  ORDER BY sale_date
  ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
);

Fallgropen med kalenderdagar jämfört med rader

En subtil fälla: om tabellen saknar dagar omfattar ROWS 6 PRECEDING de 7 senaste registrerade raderna, vilket kan sträcka sig över mer än 7 kalenderdagar.

För ett verkligt kalenderbaserat sjudagarsmedelvärde som respekterar luckor kan Ni använda RANGE med en intervallförskjutning eller först koppla en komplett datumserie till tabellen så att varje dag får en rad. Att nämna denna skillnad är precis den insikt om ROWS jämfört med RANGE som togs upp i föregående lektion.

SELECT
  sale_date,
  AVG(amount) OVER (
    ORDER BY sale_date
    RANGE BETWEEN INTERVAL '6 days' PRECEDING AND CURRENT ROW
  ) AS calendar_avg_7d
FROM daily_sales;

Glidande medelvärden per grupp

Precis som löpande totalsummor behöver glidande medelvärden vanligtvis återställas per entitet. Lägg till PARTITION BY så att varje produkt eller butik får sitt eget rullande fönster som inte blandas ihop med andra grupper.

Ramen och sorteringsordningen fungerar oberoende inom varje partition, så de första raderna i varje grupp börjar korrekt med sin egen uppvärmningsperiod.

SELECT
  product_id,
  sale_date,
  AVG(amount) OVER (
    PARTITION BY product_id
    ORDER BY sale_date
    ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
  ) AS product_ma_7d
FROM daily_sales;

Utjämning i praktiken

Varför göra detta? Dagliga intäkter är ryckiga; ett glidande medelvärde synliggör trenden. Ett vanligt analyssvar är att visa det ursprungliga värdet tillsammans med den utjämnade linjen, så att dashboarden visar både signal och brus.

Ni kan också jämföra ett kort och ett långt glidande medelvärde (till exempel 7 dagar jämfört med 30 dagar) för att upptäcka momentum, SQL-motsvarigheten till en korsning mellan glidande medelvärden.

SELECT
  sale_date,
  amount,
  AVG(amount) OVER (ORDER BY sale_date
    ROWS BETWEEN 6 PRECEDING AND CURRENT ROW)  AS ma_7,
  AVG(amount) OVER (ORDER BY sale_date
    ROWS BETWEEN 29 PRECEDING AND CURRENT ROW) AS ma_30
FROM daily_sales;

Intervjuchecklista

För att besvara en fråga om glidande medelvärden på ett övertygande sätt bör Ni ta upp:

  • AVG OVER (ORDER BY ... ROWS BETWEEN n-1 PRECEDING AND CURRENT ROW).
  • Fönsterstorlek = preceding + 1.
  • Valet mellan bakåtblickande och centrerat.
  • Uppvärmning med partiella fönster och hur de döljs.
  • ROWS jämfört med RANGE när dagar saknas.
  • PARTITION BY för att återställa per entitet.

Snabbkontroll

Välj ramen för ett bakåtblickande glidande medelvärde över 7 dagar med dagliga rader.

Sammanfattning: glidande medelvärden

Ett glidande medelvärde är AVG(value) OVER (ORDER BY ... ROWS BETWEEN n-1 PRECEDING AND CURRENT ROW), där fönsterstorleken är antalet föregående rader plus en. Välj ett bakåtblickande eller centrerat fönster utifrån användningsfallet, hantera uppvärmningsraderna med en COUNT-kontroll och byt till ett RANGE-intervall när luckor i kalendern spelar roll.

Återställ per entitet med PARTITION BY och återanvänd ramar med ett namngivet WINDOW. Nästa steg är att omvandla kumulativa summor till procent med en löpande andel av totalsumman.

Gratis att börja

Lär dig SQL 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
30
Lektioner
120

Vanliga frågor

Är lektionen ”Glidande medelvärden över ett rullande fönster” gratis?

Ja – hela texten till ”Glidande medelvärden över ett rullande fönster” 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örberedelser inför SQL-intervjun, kan Ni uppgradera till CoddyKit PRO. Kursen i Förberedelser inför SQL-intervjun innehåller totalt 4 lektioner.

Vad lär jag mig i ”Glidande medelvärden över ett rullande fönster”?

Beräkna rullande medelvärden för N perioder med BETWEEN PRECEDING AND CURRENT ROW Ni övar på Förberedelser inför SQL-intervjun 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örberedelser inför SQL-intervjun?

Du behöver inga förkunskaper. Utbildningen i Förberedelser inför SQL-intervjun 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 3 av 4.

Hur lång tid tar lektionen ”Glidande medelvärden över ett rullande fönster”?

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örberedelser inför SQL-intervjun-lektionen?

Ja. Varje Förberedelser inför SQL-intervjun-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

  1. Kumulativa summor med fönsterramar
  2. ROWS kontra RANGE som ram
  3. Glidande medelvärden över ett rullande fönster
  4. Kumulativ fördelning och andel av totalen
← Tillbaka till Förberedelser inför SQL-intervjun