ROWS kontra RANGE som ramme
Den subtile og ofte testede forskel mellem række- og værdibaserede rammer
ROWS kontra RANGE som ramme er en gratis Forberedelse til kodeinterviews-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Forberedelse til kodeinterviews, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Forberedelse til kodeinterviews-kurset indeholder 4 lektioner i alt.
Den forskel, interviewere undersøger
Når du først kan skrive en løbende total, er den naturlige opfølgning: "Hvad er forskellen mellem ROWS og RANGE i en vinduesramme?" Dette er et præcist signal om mellemniveau. Mange kandidater bruger rammer til daglig uden nogensinde at opdage, at de to nøgleord opfører sig forskelligt.
Begge definerer det sæt af rækker, aggregatet ser, men de tæller dette sæt på fundamentalt forskellige måder. Få det rigtigt, så skiller du dig ud.
ROWS tæller fysiske rækker
ROWS er positionsbaseret. ROWS BETWEEN 2 PRECEDING AND CURRENT ROW betyder helt bogstaveligt den aktuelle række plus de to fysiske rækker direkte over den i den ordnede sekvens.
Det tager ikke hensyn til, om naborækker har samme ORDER BY-værdi. Tre rækker betyder tre rækker, punktum. Det er næsten altid denne ramme, du vil bruge til glidende gennemsnit og strikte løbende totaler.
SELECT
sale_date,
amount,
SUM(amount) OVER (
ORDER BY sale_date
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
) AS rows_sum
FROM sales;RANGE tæller efter værdi
RANGE er værdibaseret. Den inkluderer alle rækker, hvis ORDER BY-værdi falder inden for et logisk interval omkring den aktuelle rækkes værdi, ikke et antal rækker.
Den vigtigste konsekvens er, at alle rækker, der har samme ORDER BY-værdi, med RANGE behandles som en enkelt gruppe af ligestillede rækker. De får alle samme ramme og dermed samme resultat.
SELECT
sale_date,
amount,
SUM(amount) OVER (
ORDER BY sale_date
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) AS range_sum
FROM sales;Eksemplet med ens værdier, der afslører forskellen
Antag, at to salg begge finder sted 2024-03-02, med beløbene 30 og 40, og at de er forudgået af 2024-03-01 med beløbet 100.
- Med RANGE til CURRENT ROW: begge 03-02-rækker er ligestillede, så begge viser 100 + 30 + 40 = 170.
- Med ROWS til CURRENT ROW: den første 03-02-række viser 130, den anden viser 170, fordi hver række udvider rammen én position ad gangen.
Samme data, forskellige tal. Denne forskel ved ens værdier er kernen i spørgsmålet.
Hvorfor standarden er RANGE
Husk, at OVER (ORDER BY ...) uden en eksplicit ramme som standard bruger RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.
Det betyder, at en naiv løbende total i stilhed bruger RANGE. Med entydige sorteringsnøgler er den identisk med ROWS, så fejlen skjuler sig. Så snart der kommer dublerede sorteringsværdier, samler din løbende total i stilhed ens rækker. Derfor skriver erfarne udviklere ROWS eksplicit.
RANGE med numeriske forskydninger
RANGE kan tage en værdibaseret forskydning, ikke kun UNBOUNDED. RANGE BETWEEN 7 PRECEDING AND CURRENT ROW over en dato- eller talkolonne inkluderer alle rækker, hvis værdi ligger højst 7 enheder fra den aktuelle værdi.
Over datoer giver dette et ægte vindue for "de seneste 7 dage", som korrekt springer manglende dage over, mens ROWS 7 PRECEDING henter de foregående 7 rækker uanset eventuelle huller. Det er et stærkt svar at kende denne nuance.
SELECT
sale_date,
amount,
SUM(amount) OVER (
ORDER BY sale_date
RANGE BETWEEN INTERVAL '7 days' PRECEDING AND CURRENT ROW
) AS last_7_days
FROM sales;ROWS ignorerer huller
Den anden side af sagen er, at ROWS ikke har noget begreb om huller i dataene. Hvis din salgstabel mangler weekender, dækker ROWS BETWEEN 6 PRECEDING AND CURRENT ROW 7 registrerede dage, hvilket faktisk kan strække sig over to kalenderuger.
Valget afhænger derfor af hensigten: de seneste N poster betyder ROWS, mens de seneste N værdienheder (dage, kroner) betyder RANGE med en forskydning.
Realitetstjek af dialektunderstøttelse
Et ærligt svar i en jobsamtale nævner forskelle i understøttelsen:
- PostgreSQL understøtter
RANGEmed forskydninger (siden v11) ogROWSfuldt ud. - SQL Server understøtter
ROWSogRANGE, menRANGEkun medUNBOUNDED/CURRENT ROW, ikke med numeriske forskydninger. - MySQL 8 understøtter begge dele, men kun et begrænset udvalg af forskydningstyper for
RANGE.
Hvis en numerisk RANGE-forskydning ikke er tilgængelig, kan du efterligne den med et selvjoin eller en genereret kalender. Det viser, at du forstår produktionsforhold.
GROUPS: Den tredje tilstand
Der findes en mindre kendt tredje rammestilstand: GROUPS. Den tæller grupper af ligestillede rækker i stedet for rækker eller værdier. GROUPS BETWEEN 1 PRECEDING AND CURRENT ROW inkluderer den aktuelle gruppe af ligestillede rækker og gruppen lige før den.
Det er sjældent nødvendigt, men hvis du nævner det, når du bliver spurgt "findes der andre rammestilstande?", demonstrerer du en reel dybde i emnet. Det understøttes i PostgreSQL 11+ og nogle få andre systemer.
SELECT
sale_date,
amount,
SUM(amount) OVER (
ORDER BY sale_date
GROUPS BETWEEN 1 PRECEDING AND CURRENT ROW
) AS two_day_groups
FROM sales;En beslutningsregel, du kan fremsige
Kog hele emnet ned til én sætning, du kan sige i en jobsamtale:
"Brug ROWS, når jeg mener et fast antal fysiske rækker, brug RANGE, når jeg mener et logisk interval af sorteringsværdien, og husk, at ens værdier får dem til at afvige, fordi standardværdien for RANGE samler ens værdier."
Den ene sætning besvarer spørgsmålet fuldstændigt og overbevisende.
Sammenligning side om side
Hvis du sætter begge rammer ind i én forespørgsel, bliver forskellen synlig. Kør den på data med duplikerede datoer, og sammenlign de to kolonner række for række.
På unikke datoer er kolonnerne helt ens; på datoer med ens værdier gentager RANGE-kolonnen den samme total for de ligestillede rækker, mens ROWS-kolonnen stiger ét trin ad gangen.
SELECT
sale_date,
amount,
SUM(amount) OVER (ORDER BY sale_date
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS rows_total,
SUM(amount) OVER (ORDER BY sale_date
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS range_total
FROM sales;Hurtigt tjek
To rækker har samme værdi i ORDER BY med en standardramme. Hvad sker der?
Opsummering: ROWS vs RANGE
ROWS tæller fysiske rækker, mens RANGE tæller ud fra sorteringskolonnens logiske værdi og samler ens værdier som ligestillede rækker. Standardrammen for OVER (ORDER BY ...) er RANGE, og derfor kan en naiv løbende total samle duplikerede sorteringsværdier.
Vælg ROWS til "de seneste N poster" og glidende vinduer, der er ufølsomme over for huller; vælg RANGE med en forskydning til "de seneste N dage/kroner", når der skal tages højde for huller. Det er en fordel at vide, at GROUPS findes. Derefter bruger vi ROWS-rammer til at opbygge glidende gennemsnit.
Lær Forberedelse til kodeinterviews med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 90
- Lektioner
- 360
Ofte stillede spørgsmål
Er lektionen “ROWS kontra RANGE som ramme” gratis?
Ja — hele teksten til “ROWS kontra RANGE som ramme” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Forberedelse til kodeinterviews-kurset, skal du opgradere til CoddyKit PRO. Forberedelse til kodeinterviews-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “ROWS kontra RANGE som ramme”?
Den subtile og ofte testede forskel mellem række- og værdibaserede rammer Du øver dig i Forberedelse til kodeinterviews med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Forberedelse til kodeinterviews?
Der kræves ingen tidligere erfaring. Forberedelse til kodeinterviews på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.
Hvor lang tid tager lektionen “ROWS kontra RANGE som ramme”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Forberedelse til kodeinterviews-lektion?
Ja. Alle Forberedelse til kodeinterviews-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Kumulative summer med vinduesrammer
- ROWS kontra RANGE som ramme
- Glidende gennemsnit over et forskydeligt vindue
- Kumulativ fordeling og andel af totalen