Usando la funzione LAG in MySQL

Usando la funzione LAG in MySQL
MySQL versione 8.0 ha introdotto le funzioni della finestra MySQL, consentendo di eseguire query in un metodo più semplice e organizzato. Pertanto, aumentando l'elaborazione e le prestazioni. Tali funzioni includono: rank (), row_rank (), last_value () e molti altri.

In questo tutorial, ci concentreremo sull'uso di una delle funzioni MySQL: Lag (). È una funzione finestra che consente di accedere e recuperare il valore delle righe precedenti dalla riga corrente all'interno dello stesso set di risultati.

Sintassi di base

La sintassi generale per l'utilizzo della funzione mysql lag () è:

Lag (espressione, offsetValue, defaultVar) su (
Partizione per [espressione]
Ordine per espressione [Asc | Desc]
);

Prendiamo un momento per spiegare alcuni dei parametri nella sintassi della funzione Lag ().

Sono i seguenti:

Espressione: Questo è il valore restituito dalla funzione dalla riga che conduce la riga corrente per il valore di offset specificato.

OffsetValue: Questo valore rappresenta il numero di righe che precedono la riga corrente da cui ottenere il valore. Questo valore deve essere uno 0 o un valore superiore a 0.

NOTA: Il valore di 0 rappresenta la riga corrente.

DefaultVar: Questo valore viene restituito come valore predefinito per funzione se non esiste una riga precedente. Se il valore predefinito non è definito nel parametro della funzione e non esiste alcuna riga precedente, la funzione restituisce un valore nullo.

Partizione di: La clausola di partizione per clausole divide le righe in un set di partizione logica. La funzione di ritardo viene quindi applicata alle partizioni divise.

ORDINATO DA: Come al solito, questo valore specifica l'ordine delle righe nelle partizioni disponibili.

Esempio di casi d'uso

Diamo un'occhiata ai casi d'uso di esempio della funzione Lag () per capire come funziona. Inizia creando un database di esempio chiamato Sample_DB;

Drop database se esiste sample_database;
Crea database sample_database;
Utilizzare sample_database;
Drop tabella se esistono utenti;
Crea utenti della tabella
(
Id int primario chiave Auto_increment,
Nome varchar (255),
Punteggio int,
Data di iscrizione
);
Inserisci in utenti (id, nome, punteggio, iscrizione_date)
Valori (1, "Alexandra", 99, '2021-01-10'),
(2, "Jacob", 81, '2021-05-20'),
(3, "Leonard", 67, '2020-01-02'),
(4, "Peter", 88, '2021-03-03'),
(5, "Amy", 100, '2021-05-05');
Seleziona * dagli utenti;

Ora che abbiamo un database di esempio con cui lavorare, possiamo procedere e illustrare come lavorare con la funzione Lag MySQL.

Esempio 1: funzione LAG senza valore predefinito
Considera l'esempio seguente che applica la funzione LAG su iscrizione_date con un valore di offset di 1.

Selezionare *, lag (iscrizione_date, 1) over (ordine per id asc) come precedente_date da sample_database.utenti;

Una volta eseguite la query sopra, otteniamo una nuova colonna precedente_date che contiene il valore precedente della riga come specificato con un valore di offset di 1. Poiché non esiste un valore precedente nella prima riga, il valore è nullo.

Nota: è possibile specificare il valore predefinito se una riga non ha un valore precedente.

L'output è come mostrato di seguito:

Esempio 2: funzione LAG con valore predefinito
È inoltre possibile specificare un valore predefinito per una riga in cui il valore precedente non esiste. Nel nostro esempio, imposteremo il valore predefinito nella data corrente.

Nota: in questo esempio, imposteremo anche il valore di offset come 2 anziché 1.

Considera la query di seguito:

Seleziona *, lag (iscrizione_date, 2, curdate ()) su (ordine per id asc) come precedente_date da sample_database.utenti;

Una volta eseguita la query sopra, otterremo valori con un valore di offset di due e la data corrente come impostazione predefinita per i valori null.

L'output è come mostrato di seguito:

Esempio 3: funzione Lag con partizione di
Possiamo usare la funzione Lag () con la clausola partizione per. Questa clausola prima raggruppa i dati in vari sottoinsiemi logici e quindi applica la funzione di ritardo alle partizioni.

Prima di procedere, vediamo i dati nella tabella dell'utente. Considera la seguente domanda:

Inserisci in utenti (id, nome, punteggio, iscrizione_date)
Valori (1, "Alexandra", 99, '2021-01-10'),
(2, "Jacob", 81, '2021-05-20'),
(3, "Leonard", 67, '2020-01-02'),
(4, "Peter", 88, '2021-03-03'),
(5, "Amy", 100, '2021-05-05'),
(6, "Tobias", 100, '2020-06-06'),
(7, "Kurtzman", 67, '2020-07-10'),
(8, "immortale", 50, '2021-03-01'),
(9, "Anthony", 81, '2021-01-01'),
(10, "James", 77, '2021-02-03');

Ora che abbiamo una tabella con 10 valori, possiamo partizionare i dati per punteggio e quindi applicare la funzione di ritardo.

L'operazione sopra è illustrata nella query seguente:

Seleziona *, lag (iscrizione_date, 1, Curdate ()) su (partizione per ordine di punteggio per ID ASC) come precedente_date da sample_database.utenti;

Nella query sopra, iniziamo partizionando i dati in base al punteggio e quindi applicando la funzione LAG con un valore di offset di 1. Abbiamo anche impostato il valore predefinito come data corrente. Il risultato di output è come mostrato di seguito:

Nota: è possibile anche notare che la prima riga di ogni partizione contiene la data corrente, il che significa che non esiste un valore precedente nella riga impostata.

Conclusione

Questo tutorial ha discusso di come funziona la funzione Lag () per ottenere valori delle righe precedenti nella riga corrente.

Per ricapitolare:

  • La funzione mysql è una funzione finestra che ottiene il valore dalla riga precedente in base al valore di offset specificato. Significa, se il valore di offset è 1, ottiene il valore direttamente sopra di esso.
  • Per impostazione predefinita, la funzione Lag () utilizza un valore di offset di 1, a meno che non sia esplicitamente specificato.
  • Se i dati sono fuori portata (nessun valore precedente nell'offset specificato) il valore è impostato su NULL.
  • La funzione LAG () accetta anche la partizione per clausola, che raggruppa i dati in varie partizioni logiche in base alla colonna o alla condizione specificata.

Grazie per aver letto.