sql >> Database teknologi >  >> RDS >> Mysql

Simuler lagfunktion i MySQL

Dette er mit yndlings MySQL-hack.

Sådan emulerer du forsinkelsesfunktionen:

SET @quot=-1;
select time,company,@quot lag_quote, @quot:=quote curr_quote
  from stocks order by company,time;
  • lag_quote indeholder værdien af ​​forrige rækkes citat. For den første række er @quot -1.
  • curr_quote indeholder værdien af ​​den aktuelle rækkes anførselstegn.

Bemærkninger:

  1. order by klausul er vigtig her, ligesom det er i en almindelig vinduesfunktion.
  2. Du vil måske også bruge lag for company bare for at være sikker på, at du beregner forskellen i anførselstegn for det samme company .
  3. Du kan også implementere rækketællere på samme måde @cnt:[email protected]+1

Det gode ved dette skema er, at det er beregningsmæssigt meget magert sammenlignet med nogle andre tilgange som f.eks. brug af aggregerede funktioner, lagrede procedurer eller behandling af data i applikationsserveren.

EDIT:

Nu kommer til dit spørgsmål om at få resultatet i det format, du nævnte:

SET @quot=0,@latest=0,company='';
select B.* from (
select A.time,A.change,IF(@comp<>A.company,1,0) as LATEST,@comp:=A.company as company from (
select time,company,[email protected] as change, @quot:=quote curr_quote
from stocks order by company,time) A
order by company,time desc) B where B.LATEST=1;

Indlejringen er ikke co-relateret, så ikke så slem (beregningsmæssigt), som den ser ud (syntaktisk) :)

Sig til, hvis du har brug for hjælp til dette.



  1. Fejlfindingstabel ikke fundet Fejl

  2. SQL Server 2008 Tom streng vs. plads

  3. Sådan udføres Stored Procedure fra Laravel

  4. Databasemodel for et meddelelsessystem