Criteri ROWS e RANGE
Fa parte della sezione Fondamenti del percorso SQL di Coddy. Lezione 69 di 72.
Al momento, non possiamo essere flessibili nella scelta di quante righe precedenti o successive prendere in considerazione. Ora è possibile farlo con i criteri ROWS e RANGE. Per usarli scriviamo:
OVER (ROWS BETWEEN --START-- AND --END--)
OVER (RANGE BETWEEN --START-- AND --END--)
E possiamo specificare le seguenti opzioni:
CURRENT ROW- la riga correnten PRECEDING- righe precedenti alla riga correnten FOLLOWING- righe successive alla riga corrente
La differenza tra ROWS & RANGE è che il criterio ROWS non tiene conto dei valori, ma solo delle posizioni, mentre RANGE definisce la finestra in termini di intervalli di valori anziché di posizioni delle righe.
Per RANGE dobbiamo specificare ORDER BY --column_name-- perché altrimenti non saprebbe come scegliere la finestra.
Per esempio:
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWINGQui crea una finestra che include la riga corrente, la riga precedente e la riga successiva.
RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING ORDER BY levelsQui crea una finestra che include, per ogni livello (ordinato in ordine crescente), il livello attuale, un livello prima e un livello dopo. Se il livello attuale è 5, includerà i livelli 4, 5 e 6.
Nota: L'uso di RANGE BETWEEN potrebbe comportare l'inclusione di più righe nella finestra, perché include tutte le righe che condividono gli stessi valori di quelle nell'intervallo, mentre ROWS BETWEEN includerà sempre lo stesso numero di righe (purché siano disponibili nel set di dati).
Inoltre RANGE non supporta le colonne di date.
Ecco un semplice esempio per illustrare ROWS rispetto a RANGE:
Usando ROWS:
SELECT employee_name, salary,
AVG(salary) OVER (
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
) as avg_salary_rowsUtilizzo di RANGE:
SELECT employee_name, salary,
AVG(salary) OVER (
ORDER BY salary
RANGE BETWEEN 1000 PRECEDING AND 1000 FOLLOWING
) as avg_salary_rangeSfida
FacileTabelle e colonne disponibili:
newspapers:date,num_newspapers
Per questa sfida, abbiamo i dati sulla produzione di giornali. Vorremmo conoscere la media dei giornali stampati nei due giorni precedenti la riga corrente e nel giorno successivo. Inoltre, vorremmo conoscere la differenza tra il numero massimo e minimo di giornali stampati dalla data corrente e nei tre giorni precedenti. Chiama queste colonne rispettivamente avg_newspapers e diff_newspapers.
Provalo tu
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Fondamenti
4Altre parole chiave
La parola chiave INLa parola chiave BETWEENLa parola chiave LIKELa parola chiave ASRiepilogo - Modelli di telefoni cellulari2Condizioni
Basi delle condizioniLa parola chiave ANDLa parola chiave ORLa parola chiave NOTCombinare più condizioniParentesiValori booleani5Operazioni aritmetiche
Operatori matematiciColonne matematicheL’operazione moduloLa funzione ROUND()3Formato di restituzione specifico
Valori nullOrdinare i risultati Parte 1Ordinare i risultati Parte 2Riepilogo - Azienda di sicurezza informaticaLimitare il numero di recordRiepilogo - Fabbrica di veicoli6Sfide introduttive
Ripasso - Elezione parlamentareRipasso - Arresto di un criminale da parte della poliziaRipasso - Contenitore per bevande da barRipasso - Progetta nuove colonne9Tabelle multiple
JOIN di base, parte 1JOIN di base, parte 2Riepilogo - JOINSelf joinRiepilogo - Self joinUNIONSemplificare le query, parola chiave WITHRiepilogo - Query con WITHRiepilogo - Impresa edile immobiliare12Funzioni finestra, parte 2
Funzioni RANK e DENSE_RANKRipasso: RANK e DENSE_RANKFunzione NTILEFunzioni di aggregazioneCriteri ROWS e RANGEEsercitati da solo: Playground SQL