Dit is mijn favoriete MySQL-hack.
Zo emuleert u de lag-functie:
SET @quot=-1;
select time,company,@quot lag_quote, @quot:=quote curr_quote
from stocks order by company,time;
lag_quote
bevat de waarde van de quote van de vorige rij. Voor de eerste rij is @quot -1.curr_quote
bevat de waarde van de quote van de huidige rij.
Opmerkingen:
order by
clausule is hier belangrijk, net als in een regularwindow-functie.- Misschien wilt u ook lag gebruiken voor
company
om er zeker van te zijn dat u het verschil berekent tussen aanhalingstekens van hetzelfdecompany
. - U kunt ook rijtellers op dezelfde manier implementeren
@cnt:[email protected]+1
Het leuke van dit schema is dat het rekenkundig erg mager is in vergelijking met sommige andere benaderingen, zoals het gebruik van geaggregeerde functies, opgeslagen procedures of het verwerken van gegevens in de applicatieserver.
EDIT:
Nu kom je bij je vraag om resultaten te krijgen in het formaat dat je noemde:
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;
Het nesten is niet co-gerelateerd, dus niet zo slecht (rekenkundig) als het lijkt (syntactisch) :)
Laat het me weten als je hier hulp bij nodig hebt.