C'est mon hack MySQL préféré.
Voici comment émuler la fonction de décalage :
SET @quot=-1;
select time,company,@quot lag_quote, @quot:=quote curr_quote
from stocks order by company,time;
lag_quote
contient la valeur de la citation de la ligne précédente. Pour la première ligne, @quot vaut -1.curr_quote
contient la valeur de la citation de la ligne actuelle.
Remarques :
order by
La clause est importante ici, tout comme dans une fonction regularwindow.- Vous pouvez également utiliser le décalage pour
company
juste pour être sûr que vous calculez la différence entre les guillemets de la mêmecompany
. - Vous pouvez également implémenter des compteurs de lignes de la même manière
@cnt:[email protected]+1
La bonne chose à propos de ce schéma est qu'il est très léger en termes de calcul par rapport à d'autres approches telles que l'utilisation de fonctions d'agrégation, de procédures stockées ou de traitement de données dans le serveur d'applications.
MODIFIER :
Venons-en maintenant à votre question sur l'obtention d'un résultat dans le format que vous avez mentionné :
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;
L'imbrication n'est pas co-liée donc pas aussi mauvaise (informatiquement) qu'elle en a l'air (syntaxiquement) :)
Faites-moi savoir si vous avez besoin d'aide pour cela.