SQL Lag

Sql Lag



Funcția SQL lag() vă permite să accesați rândul anterior din rândul curent la un anumit decalaj. Pe scurt, funcția lag() vă permite să accesați rândul anterior de pe cel curent. Prin specificarea valorii offset, puteți accesa rândurile anterioare 1, 2, 3 etc. din cel curent.

Este opusul funcției lead() care vă permite să accesați rândurile ulterioare.







SQL Lag()

Sintaxa funcției este următoarea:



LAG(expresie_valoare, offset [, implicit])
Peste (
[PARTITION BY partition_expression]
ORDER BY expresie_sort [ASC | DESC]
);

Următoarele sunt argumentele susținute:



  • expresie_valoare – Specifică valoarea returnată a rândului precedent. Expresia trebuie să fie evaluată la o singură valoare.
  • decalaj – Specifică câte rânduri înapoi de la rândul curent pentru a accesa.
  • Mod implicit – Setează valoarea implicită dacă offset-ul este în afara domeniului de aplicare al partiției. În mod implicit, valoarea este setată la NULL.
  • Împărțire prin – Specifică modul de partiţionare a datelor.
  • Comandă până la – Setează formatul de ordine pentru rândurile din fiecare partiție.

Eșantion de configurare a datelor

Înainte de a ne aprofunda în funcționarea funcției lag(), să începem prin a configura un tabel de bază în scopuri demonstrative.





produse CREATE TABLE (
product_id INT PRIMARY KEY AUTO_INCREMENT,
nume_produs VARCHAR(255),
categoria VARCHAR(255),
prețul DECIMAL(10, 2),
cantitate INT,
expiration_date DATE,
cod de bare BIGINT
);

introduce
în
produse (nume_produs,
categorie,
Preț,
cantitate,
data expirării,
cod de bare)
valori („Pălărie de bucătar 25 cm”,
'brutărie',
24.67,
57,
„2023-09-09”,
2854509564204);

introduce
în
produse (nume_produs,
categorie,
Preț,
cantitate,
data expirării,
cod de bare)
valori ('Ouă de prepeliță - Conserve',
'cămară',
17.99,
67,
„2023-09-29”,
1708039594250);

introduce
în
produse (nume_produs,
categorie,
Preț,
cantitate,
data expirării,
cod de bare)
valori ('Cafea - Capuccino cu ciurșor de ouă',
'brutărie',
92,53,
10,
„2023-09-22”,
8704051853058);

introduce
în
produse (nume_produs,
categorie,
Preț,
cantitate,
data expirării,
cod de bare)
valori („Pere - înțepător”,
'brutărie',
65,29,
48,
„2023-08-23”,
5174927442238);

introduce
în
produse (nume_produs,
categorie,
Preț,
cantitate,
data expirării,
cod de bare)
valori ('Paste - Păr de înger',
'cămară',
48,38,
59,
„2023-08-05”,
8008123704782);

introduce
în
produse (nume_produs,
categorie,
Preț,
cantitate,
data expirării,
cod de bare)
valori ('Vin - Prosecco Valdobiaddene',
'legume şi fructe',
44.18,
3,
„2023-03-13”,
6470981735653);

introduce
în
produse (nume_produs,
categorie,
Preț,
cantitate,
data expirării,
cod de bare)
valori („Pateterie - Mini sortiment francez”,
'cămară',
36,73,
52,
„2023-05-29”,
5963886298051);

introduce
în
produse (nume_produs,
categorie,
Preț,
cantitate,
data expirării,
cod de bare)
valori („Portocale - Conservă, Mandarină”,
'legume şi fructe',
65,0,
1,
„2023-04-20”,
6131761721332);

introduce
în
produse (nume_produs,
categorie,
Preț,
cantitate,
data expirării,
cod de bare)
valori ('Carne de porc - Umăr',
'legume şi fructe',
55,55,
73,
„2023-05-01”,
9343592107125);

introduce
în
produse (nume_produs,
categorie,
Preț,
cantitate,
data expirării,
cod de bare)
valori ('Dc Hikiage Hira Huba',
'legume şi fructe',
56,29,
53,
„2023-04-14”,
3354910667072);

Odată cu crearea și configurarea datelor finalizate, haideți să continuăm să discutăm câteva exemple.

Exemplul 1: Utilizare de bază

În acest caz, avem acces la un tabel „produse” care conține informațiile despre produs. Să presupunem că vrem să obținem codul de bare anterior din rândul curent.



Putem folosi funcția lag() după cum urmează:

Selectați
numele produsului,
Preț,
lag(cod de bare) peste (partiție după categorie
comanda de
preţ asc) ca element_precedent
din
produse p;

Codul dat partiţionează datele în funcţie de categorie. Apoi preia codul de bare anterior din partiție folosind funcția lag().

Rezultatul rezultat este după cum urmează:

Exemplul 2: Setarea valorii implicite

Dacă nu există un rând anterior într-o coloană specifică (în afara limitelor), funcția setează valoarea la NULL așa cum se arată în exemplul anterior.

Pentru a seta o valoare implicită pentru orice acces în afara domeniului de aplicare, putem face următoarele:

Selectați
numele produsului,
Preț,
lag(cod de bare, 1, „N/A”) peste (partiție după categorie
comanda de
preţ asc) ca element_precedent
din
produse p;

Setăm valoarea implicită la „N/A”. Aceasta ar trebui să înlocuiască orice valoare în afara limitei, așa cum se arată în rezultat:

Exemplul 3: Valoare de compensare personalizată

Să presupunem că doriți să accesați cele două rânduri anterioare din rândul curent. Putem face asta setând valoarea offset-ului la 2.

Un exemplu de interogare este ilustrat în următoarele:

Selectați
numele produsului,
Preț,
lag(cod de bare, 2, „N/A”) peste (partiție după categorie
comanda de
preţ asc) ca element_precedent
din
produse p;

Ieșire:

Această interogare returnează cele două rânduri anterioare din fiecare partiție.

Concluzie

În acest tutorial, am învățat cum să lucrăm cu funcția lag() pentru a obține elementul anterior din rândul curent.