sql >> Database >  >> RDS >> Mysql

Simuleer lag-functie in MySQL

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:

  1. order by clausule is hier belangrijk, net als in een regularwindow-functie.
  2. Misschien wilt u ook lag gebruiken voor company om er zeker van te zijn dat u het verschil berekent tussen aanhalingstekens van hetzelfde company .
  3. 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.



  1. Aan de slag met Oracle LiveSQL

  2. Waarom lijk ik Oracle 11g niet te dwingen meer CPU's te verbruiken voor een enkele SQL-query?

  3. MySQL converteert datumreeks naar Unix-tijdstempel

  4. Mysql-toestemmingsfouten met 'gegevens laden'