Mysql
 sql >> Base de données >  >> RDS >> Mysql

Simuler la fonction de décalage dans MySQL

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 :

  1. order by La clause est importante ici, tout comme dans une fonction regularwindow.
  2. 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ême company .
  3. 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.