Bruke LAG -funksjon i MySQL

Bruke LAG -funksjon i MySQL
MySQL versjon 8.0 introduserte MySQL -vindusfunksjonene, slik at du kan utføre spørsmål i en enklere og organisert metode. Dermed øker behandlingen og ytelsen. Slike funksjoner inkluderer: rang (), row_rank (), last_value () og mange flere.

I denne opplæringen skal vi fokusere på å bruke en av MySQL -funksjonene: etterslep (). Det er en vindusfunksjon som lar deg få tilgang til og hente verdien av tidligere rader fra den nåværende raden innenfor samme resultatsett.

Grunnleggende syntaks

Den generelle syntaksen for bruk av MySQL LAG () -funksjonen er:

Lag (uttrykk, offsetvalue, standardvar) over (
Partisjon av [uttrykk]
Bestill etter uttrykk [ASC | Desc]
);

La oss ta et øyeblikk å forklare noen av parametrene i LAG () -funksjonssyntaks.

De er som følger:

Uttrykk: Dette er verdien som returneres av funksjonen fra raden som fører den gjeldende raden med den angitte verdien som er spesifisert.

OffsetValue: Denne verdien representerer antall rader som går foran den nåværende raden for å få verdien. Denne verdien må være en 0 eller en verdi høyere enn 0.

MERK: Verdien av 0 representerer den nåværende raden.

DefaultVar: Denne verdien returneres som standardverdien av funksjonen hvis det ikke eksisterer noen foregående rad. Hvis standardverdien er udefinert i funksjonsparameteren og ingen foregående rad eksisterer, returnerer funksjonen en nullverdi.

Partisjon av: Partisjonen etter klausul deler radene i et logisk partisjonssett. Lag -funksjonen blir deretter brukt på de delte partisjonene.

REKKEFØLGE ETTER: Som vanlig spesifiserer denne verdien rekkefølgen på radene i de tilgjengelige partisjonene.

Eksempel Bruk saker

La oss se på eksempel på bruk av tilfeller av etterslep () funksjon for å forstå hvordan det fungerer. Begynn med å opprette en eksempeldatabase kalt Sample_DB;

Drop -databasen hvis eksisterer prøve_database;
Opprette databaseprøve_database;
Bruk prøve_database;
Drop -tabellen hvis det finnes brukere;
Lag tabellbrukere
(
id int primær nøkkel auto_increment,
Navn varchar (255),
Score int,
Registrer_dato dato
);
Sett inn brukere (id, navn, poengsum, melder_date)
Verdier (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');
Velg * fra brukere;

Nå som vi har en eksempeldatabase å jobbe med, kan vi fortsette og illustrere hvordan vi skal jobbe med MySQL LAG -funksjonen.

Eksempel 1: Lagfunksjon uten standardverdi
Tenk på eksemplet nedenfor som bruker etterslepfunksjonen på påmeldingsdato med en forskyvningsverdi på 1.

Velg *, Lag (ReagonS_Date, 1) Over (Bestill av ID ASC) som forrige_date fra Sample_Database.brukere;

Når vi har utført spørringen ovenfor, får vi en ny kolonne forrige_dat som inneholder den forrige verdien av raden som spesifisert med en forskyvningsverdi på 1. Siden det ikke er noen tidligere verdi i første rad, er verdien null.

Merk: Du kan spesifisere standardverdien hvis en rad ikke har en tidligere verdi.

Utgangen er som vist nedenfor:

Eksempel 2: Lag -funksjon med standardverdi
Du kan også spesifisere en standardverdi for en rad der den forrige verdien ikke eksisterer. I vårt eksempel vil vi angi standardverdien på gjeldende dato.

Merk: I dette eksemplet vil vi også angi forskyvningsverdien som 2 i stedet for 1.

Tenk på spørringen nedenfor:

Velg *, Lag (ReagonS_Date, 2, Curdate ()) Over (Bestill av ID ASC) som forrige_date fra Sample_Database.brukere;

Når vi har utført spørringen ovenfor, vil vi få verdier med en forskyvningsverdi på to og gjeldende dato som standard for nullverdier.

Utgangen er som vist nedenfor:

Eksempel 3: Lagfunksjon med partisjon av
Vi kan bruke lag () -funksjonen med partisjonen etter klausul. Denne klausulen grupperer først dataene i forskjellige logiske undergrupper og bruker deretter etterslepfunksjonen på partisjonene.

La oss se dataene i brukerens tabell før du fortsetter. Tenk på følgende spørsmål:

Sett inn brukere (id, navn, poengsum, melder_date)
Verdier (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, "Immortal", 50, '2021-03-01'),
(9, "Anthony", 81, '2021-01-01'),
(10, "James", 77, '2021-02-03');

Nå som vi har en tabell med 10 verdier, kan vi dele opp dataene etter poengsummen og deretter bruke etterslepfunksjonen.

Ovennevnte operasjon er illustrert i spørringen nedenfor:

Velg *, Lag (ReagonS_Date, 1, Curdate ()) Over (Partition by Score Order by ID ASC) som forrige_dato fra Sample_Database.brukere;

I spørringen ovenfor starter vi med å dele opp dataene basert på poengsummen og deretter bruke etterslepfunksjonen med en forskyvningsverdi på 1. Vi setter også standardverdien som gjeldende dato. Utgangsresultatet er som vist nedenfor:

Merk: Du kan også merke at den første raden i hver partisjon inneholder gjeldende dato, noe som betyr at det ikke er noen tidligere verdi i den angitte raden.

Konklusjon

Denne opplæringen har diskutert hvordan lag () -funksjonen fungerer for å få verdier av de tidligere radene i den nåværende raden.

For å oppsummere:

  • MySQL -funksjonen er en vindusfunksjon som får verdien fra forrige rad basert på den angitte verdien som er spesifisert. Betydning, hvis forskyvningsverdien er 1, får den verdien rett over den.
  • Som standard bruker LAG () -funksjonen en forskyvningsverdi på 1, med mindre eksplisitt er spesifisert.
  • Hvis dataene er utenfor rekkevidde (ingen tidligere verdier i det spesifiserte forskyvningen) er verdien satt til NULL.
  • LAG () -funksjonen godtar også partisjonen etter klausul, som grupper data i forskjellige logiske partisjoner basert på den spesifiserte kolonnen eller tilstanden.

Takk for at du leser.