0Pricing
Coding Interview Prep · Lezione

Frame ROWS e RANGE

La differenza sottile e spesso verificata tra frame basati sulle righe e frame basati sui valori

Frame ROWS e RANGE è una lezione Coding Interview Prep gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Coding Interview Prep, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Coding Interview Prep include 4 lezioni in totale.

La distinzione approfondita dagli intervistatori

Una volta imparato a scrivere un totale progressivo, la domanda di approfondimento naturale è: "Qual è la differenza tra ROWS e RANGE in un frame di finestra?" È un indicatore preciso di competenze di livello intermedio. Molti candidati usano quotidianamente i frame senza mai notare che queste due parole chiave si comportano in modo diverso.

Entrambi definiscono l'insieme di righe esaminato dall'aggregazione, ma contano quell'insieme in modi fondamentalmente diversi. Comprendere questa distinzione la farà emergere.

ROWS conta le righe fisiche

ROWS è basato sulla posizione. ROWS BETWEEN 2 PRECEDING AND CURRENT ROW significa letteralmente la riga corrente più le due righe fisiche immediatamente precedenti nella sequenza ordinata.

Non importa se le righe vicine condividono lo stesso valore di ORDER BY. Tre righe significano tre righe, senza eccezioni. È il frame che quasi sempre si desidera per le medie mobili e i totali progressivi rigorosi.

SELECT
  sale_date,
  amount,
  SUM(amount) OVER (
    ORDER BY sale_date
    ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
  ) AS rows_sum
FROM sales;

RANGE conta in base al valore

RANGE è basato sul valore. Include ogni riga il cui valore di ORDER BY rientra nell'intervallo logico del valore della riga corrente, anziché contare le righe.

La conseguenza più importante è che, con RANGE, tutte le righe che hanno lo stesso valore di ORDER BY vengono trattate come un unico gruppo di peer. Ricevono tutte lo stesso frame e quindi lo stesso risultato.

SELECT
  sale_date,
  amount,
  SUM(amount) OVER (
    ORDER BY sale_date
    RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
  ) AS range_sum
FROM sales;

L'esempio dei valori uguali che rivela la differenza

Supponga che due vendite avvengano entrambe il 2024-03-02, per importi di 30 e 40, precedute da una vendita del 2024-03-01 per un importo di 100.

  • Con RANGE fino a CURRENT ROW: entrambe le righe del 03-02 sono peer, quindi per entrambe il risultato è 100 + 30 + 40 = 170.
  • Con ROWS fino a CURRENT ROW: la prima riga del 03-02 mostra 130, la seconda 170, perché ogni riga estende il frame di una posizione alla volta.

Stessi dati, numeri diversi. Questa divergenza in presenza di valori uguali è il punto centrale della domanda.

Perché il valore predefinito è RANGE

Ricordi che OVER (ORDER BY ...) senza un frame esplicito usa per impostazione predefinita RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.

Ciò significa che un totale progressivo ingenuo usa silenziosamente RANGE. Con chiavi di ordinamento univoche è identico a ROWS, perciò il problema rimane nascosto. Non appena compaiono valori di ordinamento duplicati, il totale progressivo raggruppa silenziosamente le righe con lo stesso valore. Per questo gli sviluppatori esperti specificano esplicitamente ROWS.

RANGE con offset numerici

RANGE può accettare un offset di valore, non solo UNBOUNDED. RANGE BETWEEN 7 PRECEDING AND CURRENT ROW applicato a una colonna di date o numerica include ogni riga il cui valore si trova entro 7 unità dal valore corrente.

Applicato a una data, produce una vera finestra degli "ultimi 7 giorni" che salta correttamente i giorni mancanti, mentre ROWS 7 PRECEDING acquisirebbe le 7 righe precedenti indipendentemente dai vuoti. Conoscere questa sfumatura costituisce una risposta molto efficace.

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 ignora le lacune

Il rovescio della medaglia: ROWS non tiene conto delle lacune nei dati. Se nella tabella delle vendite mancano i fine settimana, ROWS BETWEEN 6 PRECEDING AND CURRENT ROW copre 7 giorni registrati, che in realtà possono estendersi su due settimane di calendario.

La scelta dipende quindi dall'obiettivo: ultime N registrazioni significa ROWS; ultime N unità di valore (giorni, dollari) significa RANGE con un offset.

Verifica realistica del supporto nei dialetti

Una risposta onesta a un colloquio riconosce le differenze nel supporto:

  • PostgreSQL supporta RANGE con offset (dalla v11) e supporta completamente ROWS.
  • SQL Server supporta ROWS e RANGE, ma RANGE solo con UNBOUNDED/CURRENT ROW, non con offset numerici.
  • MySQL 8 supporta entrambi, ma con tipi di offset RANGE limitati.

Se un offset numerico di RANGE non è disponibile, può simularlo con un self-join o con un calendario generato. Menzionarlo dimostra consapevolezza dell'ambiente di produzione.

GROUPS: la terza modalità

Esiste una terza modalità di definizione del frame, meno conosciuta: GROUPS. Conta i gruppi di peer anziché le righe o i valori. GROUPS BETWEEN 1 PRECEDING AND CURRENT ROW include il gruppo di peer corrente e quello precedente.

È richiesta raramente, ma citarla quando le viene chiesto "esistono altre modalità di frame?" dimostra una conoscenza approfondita. È supportata da PostgreSQL 11+ e da alcuni altri database.

SELECT
  sale_date,
  amount,
  SUM(amount) OVER (
    ORDER BY sale_date
    GROUPS BETWEEN 1 PRECEDING AND CURRENT ROW
  ) AS two_day_groups
FROM sales;

Una regola decisionale da recitare

Riassuma l'intero argomento in una frase da pronunciare durante un colloquio:

"Usi ROWS quando intende un numero fisso di righe fisiche, usi RANGE quando intende un intervallo logico del valore di ordinamento e ricordi che i valori a pari merito li fanno divergere, perché il RANGE predefinito raggruppa insieme i valori uguali."

Questa singola frase risponde alla domanda in modo completo e sicuro.

Confronto affiancato

Inserire entrambi i frame nella stessa query rende visibile la differenza. Esegua questa query su dati con date duplicate e confronti le due colonne riga per riga.

Con date univoche le colonne coincidono esattamente; con date a pari merito la colonna RANGE ripete lo stesso totale per tutti i peer, mentre la colonna ROWS aumenta di un'unità alla volta.

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;

Verifica rapida

Due righe hanno lo stesso valore di ORDER BY con un frame predefinito. Che cosa succede?

Riepilogo: ROWS vs RANGE

ROWS conta le righe fisiche; RANGE conta in base al valore logico della colonna di ordinamento e raggruppa i valori a pari merito come peer. Il frame predefinito di OVER (ORDER BY ...) è RANGE, motivo per cui un totale progressivo ingenuo può raggruppare insieme valori di ordinamento duplicati.

Scelga ROWS per le "ultime N registrazioni" e per le finestre mobili che ignorano le lacune; scelga RANGE con un offset per gli "ultimi N giorni/dollari" che tengono conto delle lacune. Sapere che esiste GROUPS è un vantaggio. Successivamente applicheremo il frame ROWS per costruire medie mobili.

Domande Frequenti

La lezione «Frame ROWS e RANGE» è gratuita?

Sì — il testo completo di «Frame ROWS e RANGE» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Coding Interview Prep, passa a CoddyKit PRO. Il corso Coding Interview Prep include 4 lezioni in totale.

Cosa imparerò in «Frame ROWS e RANGE»?

La differenza sottile e spesso verificata tra frame basati sulle righe e frame basati sui valori Eserciti Coding Interview Prep con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Coding Interview Prep?

Non è richiesta alcuna esperienza precedente. Coding Interview Prep su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.

Quanto tempo richiede la lezione «Frame ROWS e RANGE»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Coding Interview Prep?

Sì. Ogni lezione Coding Interview Prep include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Somme cumulative con i frame di finestra
  2. Frame ROWS e RANGE
  3. Medie mobili su una finestra scorrevole
  4. Distribuzione cumulativa e percentuale del totale
← Torna a Coding Interview Prep