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:
order by
klausul er vigtig her, ligesom det er i en almindelig vinduesfunktion.- 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 sammecompany
. - 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.