Förberedelser inför SQL-intervjun · Lektion

OVER, PARTITION BY och ORDER BY

En fönsterspecifikations anatomi och hur partitioner återställer beräkningen

Lektion 1 av 413 steg

OVER, PARTITION BY och ORDER BY är en gratis lektion i Förberedelser inför SQL-intervjun på CoddyKit. Detta är lektion 1 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.

Varför intervjuare väljer fönsterfunktioner

En fönsterfunktion utför en beräkning över en uppsättning rader som är relaterade till den aktuella raden, utan att slå ihop dem på samma sätt som GROUP BY gör. Det är just därför intervjuare tycker om dem: du behåller varje detaljrad och får samtidigt ett aggregat, en rangordning eller en löpande summa bredvid den.

  • GROUP BY returnerar en rad per grupp.
  • Fönsterfunktion returnerar varje indatarad med en extra beräknad kolumn.

När en intervjuare säger "visa varje anställd och den genomsnittliga lönen på avdelningen på samma rad" testar de om du väljer en fönsterfunktion i stället för en self-join.

Anatomin hos OVER-satsen

Varje fönsterfunktion följs av en OVER (...)-sats. Satsen har tre valfria delar, och det imponerar på intervjuare om du benämner dem korrekt:

  • PARTITION BY — delar upp rader i grupper; funktionen börjar om i varje grupp.
  • ORDER BY — ordnar raderna inom varje grupp (krävs för rangordning och löpande summor).
  • frame — begränsar vilka rader som används i beräkningen (ROWS/RANGE).

En tom OVER () behandlar hela resultatuppsättningen som en enda grupp.

SELECT
  name,
  department,
  salary,
  AVG(salary) OVER (PARTITION BY department) AS dept_avg
FROM employees;

Fönsterfunktion kontra aggregat: samma funktion, olika resultat

Samma aggregatfunktion beter sig annorlunda som fönsterfunktion. Jämför de två frågorna nedan på ett konceptuellt plan.

  • AVG(salary) med GROUP BY department returnerar en rad per avdelning.
  • AVG(salary) OVER (PARTITION BY department) returnerar varje anställd, märkt med genomsnittslönen för avdelningen.

Intervjutips: betona att fönsterversionen inte kräver GROUP BY och inte tar bort dubbla detaljrader.

-- Aggregate: collapses
SELECT department, AVG(salary)
FROM employees
GROUP BY department;

-- Window: preserves every row
SELECT department, name, AVG(salary) OVER (PARTITION BY department) AS dept_avg
FROM employees;

PARTITION BY: Återställa beräkningen

PARTITION BY är för fönsterfunktioner vad GROUP BY är för aggregeringar, med skillnaden att det inte slår ihop raderna. Varje unikt partitionsvärde får en egen, oberoende beräkning.

I exemplet börjar radnumreringen om på 1 för varje avdelning. Utan PARTITION BY skulle numreringen fortsätta löpande över alla anställda.

  • Ni kan partitionera efter en kolumn eller flera.
  • Utan PARTITION BY får ni en enda jättestor partition (hela mängden).
SELECT
  department,
  name,
  ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS rn
FROM employees;

ORDER BY inuti OVER

ORDER BY inuti OVER är inte samma sak som frågans avslutande ORDER BY. Det definierar bara radordningen inom varje partition som funktionen ska arbeta med.

  • Rankningsfunktioner (ROW_NUMBER, RANK) kräver detta — de behöver en ordning att rankas efter.
  • Vanliga aggregeringar över en partition behöver det inte, såvida ni inte vill ha en löpande beräkning.

Ett vanligt misstag i intervjuer är att blanda ihop fönstrets ORDER BY med presentationsordningen för resultatet.

SELECT
  name,
  hire_date,
  ROW_NUMBER() OVER (ORDER BY hire_date) AS seniority_rank
FROM employees
ORDER BY name;  -- output order is independent of the window order

Kombinera PARTITION BY och ORDER BY

Den klassiska rankningsdefinitionen kombinerar båda: PARTITION BY grupperar och därefter ordnar ORDER BY raderna inom varje grupp.

Läs specifikationen nedan som: "Inom varje avdelning sorteras de anställda efter lön i fallande ordning, och de numreras." Den högst betalda personen i varje avdelning får radnummer 1.

Denna enda specifikation är grunden för de vanligaste intervjuproblemen med fönsterfunktioner, inklusive top-N-per-group-problem.

SELECT
  department,
  name,
  salary,
  ROW_NUMBER() OVER (
    PARTITION BY department
    ORDER BY salary DESC
  ) AS dept_salary_rank
FROM employees;

ORDER BY ändrar aggregeringsbeteendet

Här är en subtil punkt som intervjuare gärna testar: när ORDER BY läggs till i ett aggregerat fönster blir beräkningen löpande, eftersom en implicit frame ("från partitionens början till den aktuella raden") börjar gälla.

  • SUM(x) OVER (PARTITION BY g) → samma grupptotal på varje rad.
  • SUM(x) OVER (PARTITION BY g ORDER BY d) → en löpande totalsumma fram till den aktuella raden.

Att känna till att ORDER BY implicit lägger till en frame skiljer kandidater på mellannivå från juniora kandidater.

SELECT
  account_id,
  txn_date,
  amount,
  SUM(amount) OVER (
    PARTITION BY account_id
    ORDER BY txn_date
  ) AS running_balance
FROM transactions;

Var fönsterfunktioner är tillåtna

Fönsterfunktioner får bara förekomma i SELECT-listan och ORDER BY-satsen. De är inte tillåtna i WHERE, GROUP BY eller HAVING.

Orsaken hänger ihop med den logiska körordningen: fönsterfunktioner utvärderas efter att WHERE, GROUP BY och HAVING har körts. Raderna är redan utvalda innan fönsterfunktionen ens ser dem.

Därför kräver filtrering baserad på rankning en underfråga eller en CTE — en punkt som behandlas fullständigt i en senare lektion.

-- This FAILS: window function in WHERE
-- SELECT name FROM employees
-- WHERE ROW_NUMBER() OVER (ORDER BY salary) = 1;

-- This works: window in SELECT, filter outside
SELECT * FROM (
  SELECT name, ROW_NUMBER() OVER (ORDER BY salary DESC) AS rn
  FROM employees
) t
WHERE rn = 1;

Flera fönsterfunktioner i samma fråga

Ni kan använda flera fönsterfunktioner i samma SELECT-sats, var och en med en egen eller gemensam specifikation. Databasen beräknar dem i ett enda svep över de partitionerade uppgifterna.

Det är praktiskt i intervjuer när ni behöver både en rankning och ett avdelningsgenomsnitt. Om två funktioner delar specifikation kan vissa dialekter låta er namnge den med en WINDOW-sats för att undvika upprepning.

SELECT
  name,
  department,
  salary,
  ROW_NUMBER() OVER w  AS rn,
  AVG(salary) OVER (PARTITION BY department) AS dept_avg
FROM employees
WINDOW w AS (PARTITION BY department ORDER BY salary DESC);

Genomräknat exempel: Lön jämfört med avdelningsgenomsnitt

En vanlig fråga för analytiker: "Visa varje anställd med sin lön, avdelningsgenomsnittet och skillnaden." Ett fönsteruttryck gör det mesta av jobbet; resten är enkel aritmetik.

Lägg märke till att det inte finns någon GROUP BY och att varje rad för en anställd finns kvar. dept_avg upprepas för alla i samma avdelning, vilket är precis det som gör jämförelsen rad för rad möjlig.

SELECT
  name,
  department,
  salary,
  AVG(salary) OVER (PARTITION BY department) AS dept_avg,
  salary - AVG(salary) OVER (PARTITION BY department) AS diff_from_avg
FROM employees
ORDER BY department, salary DESC;

Vanliga misstag som intervjuare håller utkik efter

Undvik följande fallgropar när fönsterfunktioner kommer på tal:

  • Att placera en fönsterfunktion i WHERE eller HAVING — inte tillåtet; använd en underfråga.
  • Att glömma ORDER BY för en rankningsfunktion — resultaten blir godtyckliga.
  • Att anta att PARTITION BY minskar antalet rader — det gör det aldrig.
  • Att blanda ihop fönstrets ORDER BY med den slutliga resultatordningen.
  • Att lägga till ORDER BY i ett aggregerat fönster utan att inse att det blev en löpande totalsumma.

Snabbtest

Testa hur väl ni behärskar fönsterspecifikationen.

Repetition: Fönsterspecifikationen

Ni behärskar nu uppbyggnaden av OVER (...):

  • Fönsterfunktioner behåller varje rad och beräknar samtidigt över relaterade rader.
  • PARTITION BY grupperar och startar om beräkningen; det tar aldrig bort rader.
  • ORDER BY ordnar raderna inom en partition; rankningsfunktioner kräver det, och det gör aggregeringar till löpande beräkningar.
  • Fönsterfunktioner är bara tillåtna i SELECT och ORDER BY — aldrig i WHERE/HAVING.

Härnäst tilldelar ni deterministiska sekvensnummer med ROW_NUMBER.

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 ”OVER, PARTITION BY och ORDER BY” gratis?

Ja – hela texten till ”OVER, PARTITION BY och ORDER BY” 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 ”OVER, PARTITION BY och ORDER BY”?

En fönsterspecifikations anatomi och hur partitioner återställer beräkningen 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 1 av 4.

Hur lång tid tar lektionen ”OVER, PARTITION BY och ORDER BY”?

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. OVER, PARTITION BY och ORDER BY
  2. ROW_NUMBER för unik numrering
  3. RANK kontra DENSE_RANK vid lika värden
  4. Filtrera på ett fönsterresultat
← Tillbaka till Förberedelser inför SQL-intervjun