Funkce SQL lag() umožňuje přístup k předchozímu řádku z aktuálního řádku s určitým posunem. Stručně řečeno, funkce lag() umožňuje přístup k předchozímu řádku z aktuálního. Zadáním hodnoty posunu získáte přístup k předchozím 1, 2, 3 atd. řádkům z aktuálního řádku.
Je opakem funkce lead(), která umožňuje přístup k dalším řádkům.
SQL Lag()
Syntaxe funkce je následující:
LAG(výraz_hodnoty; posun [, výchozí])
PŘES (
[PARTITION BY partition_expression]
ORDER BY sort_expression [ASC | DESC]
);
Níže jsou uvedeny podporované argumenty:
- hodnota_výraz – Určuje návratovou hodnotu předchozího řádku. Výraz se musí vyhodnotit jako jediná hodnota.
- offset – Určuje, kolik řádků zpět od aktuálního řádku má být přístup.
- výchozí – Nastaví výchozí hodnotu, pokud je posun mimo rozsah logické části. Ve výchozím nastavení je hodnota nastavena na NULL.
- Rozdělit podle – Určuje, jak rozdělit data.
- Seřadit podle – Nastavuje formát pořadí pro řádky v každém oddílu.
Ukázkové nastavení dat
Než se ponoříme do fungování funkce lag(), začněme nastavením základní tabulky pro demonstrační účely.
CREATE TABLE produkty (
product_id INT PRIMARY KEY AUTO_INCREMENT,
název_produktu VARCHAR(255),
kategorie VARCHAR(255),
cena DECIMAL(10, 2),
množství INT,
expiration_date DATE,
čárový kód VELKÝ
);
vložit
do
produkty (název_produktu,
kategorie,
cena,
Množství,
Datum spotřeby,
čárový kód)
hodnoty ('Chef Hat 25cm',
'pekařství',
24,67,
57,
'2023-09-09',
2854509564204);
vložit
do
produkty (název_produktu,
kategorie,
cena,
Množství,
Datum spotřeby,
čárový kód)
hodnoty („křepelčí vejce – konzerva“,
'spíž',
17,99,
67,
'2023-09-29',
1708039594250);
vložit
do
produkty (název_produktu,
kategorie,
cena,
Množství,
Datum spotřeby,
čárový kód)
hodnoty ('Káva – vaječný likér capuccino',
'pekařství',
92,53,
10,
'2023-09-22',
8704051853058);
vložit
do
produkty (název_produktu,
kategorie,
cena,
Množství,
Datum spotřeby,
čárový kód)
hodnoty ('Hruška – pichlavý',
'pekařství',
65,29,
48,
'2023-08-23',
5174927442238);
vložit
do
produkty (název_produktu,
kategorie,
cena,
Množství,
Datum spotřeby,
čárový kód)
hodnoty ('Těstoviny - Andělské vlasy',
'spíž',
48,38,
59,
'2023-08-05',
8008123704782);
vložit
do
produkty (název_produktu,
kategorie,
cena,
Množství,
Datum spotřeby,
čárový kód)
hodnoty („Víno – Prosecco Valdobiaddene“,
'vyrobit',
44,18,
3,
'2023-03-13',
6470981735653);
vložit
do
produkty (název_produktu,
kategorie,
cena,
Množství,
Datum spotřeby,
čárový kód)
hodnoty ('Pečivo – French Mini Assorted',
'spíž',
36,73,
52,
'2023-05-29',
5963886298051);
vložit
do
produkty (název_produktu,
kategorie,
cena,
Množství,
Datum spotřeby,
čárový kód)
hodnoty („Pomeranč – konzerva, mandarinka“,
'vyrobit',
65,0,
1,
'2023-04-20',
6131761721332);
vložit
do
produkty (název_produktu,
kategorie,
cena,
Množství,
Datum spotřeby,
čárový kód)
hodnoty („Vepřové maso – plec“,
'vyrobit',
55,55,
73,
'2023-05-01',
9343592107125);
vložit
do
produkty (název_produktu,
kategorie,
cena,
Množství,
Datum spotřeby,
čárový kód)
hodnoty („Dc Hikiage Hira Huba“,
'vyrobit',
56,29,
53,
'2023-04-14',
3354910667072);
Když je vytvoření a nastavení dat dokončeno, pojďme si probrat několik příkladů.
Příklad 1: Základní použití
V tomto případě máme přístup k tabulce „produktů“, která obsahuje informace o produktu. Předpokládejme, že chceme získat předchozí čárový kód z aktuálního řádku.
Funkci lag() můžeme použít následovně:
vybratjméno výrobku,
cena,
zpoždění (čárový kód) přes (oddíl podle kategorie
seřadit podle
cena vzestupně) jako předchozí_položka
z
produkty p;
Daný kód rozděluje data na základě kategorie. Poté načte předchozí čárový kód v oddílu pomocí funkce lag().
Výsledný výstup je následující:
Příklad 2: Nastavení výchozí hodnoty
Pokud v určitém sloupci není žádný předchozí řádek (mimo rámec), funkce nastaví hodnotu na NULL, jak je znázorněno v předchozím příkladu.
Chcete-li nastavit výchozí hodnotu pro jakýkoli přístup mimo rozsah, můžeme provést následující:
vybratjméno výrobku,
cena,
zpoždění (čárový kód, 1, 'N/A') přes (oddíl podle kategorie
seřadit podle
cena vzestupně) jako předchozí_položka
z
produkty p;
Výchozí hodnotu nastavíme na „N/A“. To by mělo nahradit jakoukoli hodnotu mimo rámec, jak je uvedeno ve výstupu:
Příklad 3: Hodnota vlastního offsetu
Předpokládejme, že chcete získat přístup k předchozím dvěma řádkům z aktuálního řádku. Můžeme to udělat nastavením hodnoty offsetu na 2.
Příklad dotazu je ilustrován následovně:
vybratjméno výrobku,
cena,
zpoždění (čárový kód, 2, 'N/A') přes (oddíl podle kategorie
seřadit podle
cena vzestupně) jako předchozí_položka
z
produkty p;
Výstup:
Tento dotaz vrátí předchozí dva řádky v každém oddílu.
Závěr
V tomto tutoriálu jsme se naučili pracovat s funkcí lag(), abychom získali předchozí položku z aktuálního řádku.