8
votes

Requête pour trouver la différence entre les lignes successives dans MySQL

Comme je suis nouveau à MySQL, cette question peut être idiote. Comment puis-je trouver la différence entre des rangées successives?
Exemple:
Une table (Tablename = 'abc') contient une seule ligne comme suit, xxx

ici, je veux obtenir la sortie comme, xxx

Comment trouver la différence comme celle-ci sans index (primaire ou auto_incrètent)?


1 commentaires

C'est une colonne, pas une ligne, et c'est seulement ordonné par coïntement. À moins que vous n'utilisiez une commande par clause dans une instruction SQL, MySQL peut renvoyer les données dans n'importe quel ordre.


3 Réponses :


4
votes

Il serait préférable de le faire en dehors de la DB en gardant une trace de la ligne précédente. Voici un certain code (j'espère que mon PHP n'est pas trop rouillé): XXX

Si vous devez le faire dans la DB pour une raison quelconque, il serait probablement préférable de créer une procédure stockée qui sera essentiellement Faites la même chose: instanciez une variable avec la valeur 0, signalez la différence pour chaque ligne et cette variable, puis définissez la variable de la valeur de la ligne.

modifié pour ajouter une commande par clause comme indiqué par John Pick


0 commentaires

9
votes

Un auto-join est un moyen de comparer des lignes consécutives: xxx


4 commentaires

sur t1.data ne causerait pas toutes les lignes ci-dessous pour produire une lignée x * y? Je veux dire que cela ne rejoindrait pas les 50 et 10,50 et 20, etc.?


@prajeeshkumar the Join serait triangulaire (x * x + x) / 2 s'il n'y avait pas pour min () , ce qui garantit les lignes correspondant 1: 1, sauf La dernière ligne qui ne correspond à rien. Le résultat est x-1 lignes.


Cela semble fonctionner uniquement pour des jeux de données monotoniquement croissants, non? Ai-je oublié quelque chose? Lorsque je l'exécute, je reçois soit un singleton (quand il n'y a pas de différence entre les valeurs) ou une différence de temps incorrecte (lorsque le jeu de données est non monotonique).


En utilisant le groupe au lieu de l'ordre en me donne les résultats que je cherche



7
votes

Utiliser des variables définies par l'utilisateur:

SET @prevValue:=0;
UPDATE t SET diff=IF((@d:=value-@prevValue) AND (@prevValue:=value),@d,@d);


0 commentaires