Ceci est mon préféré MySQL hack.
Voici comment vous imitez la fonction lag:
SET @quot=-1;
select time,company,@quot lag_quote, @quot:=quote curr_quote
from stocks order by company,time;
lag_quote
détient la valeur de la citation de la ligne précédente. Pour la première ligne @quot est -1.
curr_quote
contient la valeur de l'offre de la ligne en cours.
Notes:
order by
clause est important ici, tout comme il est dans une fonction régulière de la fenêtre.
- Vous pouvez également utiliser lag pour
company
juste pour être sûr que vous calculez la différence entre guillemets de la même company
.
- Vous pouvez également mettre en place des compteurs de ligne de la même manière
@cnt:[email protected]+1
La bonne chose à propos de ce régime est qu'il est informatiquement très maigre par rapport à d'autres approches comme l'utilisation des fonctions d'agrégation, des procédures stockées ou des données de traitement dans le serveur d'applications .
EDIT:
Venons-en maintenant à votre question d'obtenir 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 est pas co-lié donc pas aussi mauvais (informatiquement) comme il semble (syntaxiquement) :)
Faites-moi savoir si vous avez besoin d'aide avec ceci.
Y a-t-il seulement deux par société? ou est-ce variable? –
ce sont deux entreprises – javanx
Je vois que vous avez deux entreprises ici, mais y a-t-il seulement deux lignes par entreprise? Si c'est le cas, vous pouvez utiliser trivialement les agrégats 'MAX() - MIN()'. S'il y a plus de 2 lignes par 'company', c'est plus compliqué. –