calcul intervalle de plusieurs valeurs issues d'un select

Eléphanteau du PHP | 21 Messages

15 nov. 2013, 19:15

bonjour,

1/ dans ma table date, j'ai plusieurs lignes d'enregistrement de type INT.
Je voudrais savoir s'il est possible d'extraire toutes ces ligne et de calculer en même temps l'intervalle entre chaque ligne ?
exemple :
id => date
1 => 1306800000
2 => 1311638400
3 => 1313452800

En faisant un SELECT FROM maTable, je voudrais en même temps dans le select ou dans un tableau soustraire de la manière suivante :
1311638400 - 1306800000 = 4838400;
1313452800 - 1311638400 = 1814400; ... etc

2/ Enfin, je voudrais calculer la moyenne des intervalles trouvées. J'ai pensé enregistrer tous les intervalles dans une table "ecarts" puis faire in SELECT AVG FROM la table "ecarts".

Qu"en pensez-vous ?

Merci d'avance
:lol:

Mammouth du PHP | 571 Messages

15 nov. 2013, 20:22

les valeurs à soustraire sont-elles des dates?

Mammouth du PHP | 2278 Messages

15 nov. 2013, 21:14

Je ne jurerais de rien, mais la commande procedure de mysql permet peut_être de faire sans passer par une npouvelle table:
http://dev.mysql.com/doc/refman/5.0/fr/ ... alyse.html
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

15 nov. 2013, 21:49

Salut,

Effectivement une procédure stockée et une table temporaire doit pouvoir le faire.
Après il faut voir ce le SGBD cible avec mysql sera p´tet un peux complexe ;)


@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 21 Messages

16 nov. 2013, 08:47

oui ce sont des dates.

Merci mais je ne pense pas que la procedure analyse n'est pas adaptée.
J'ai pensé faire de la manière suivante :

J'ai une table avec les champs ID / DATE
1°/ je sélectionne la plus grande valeur /date :
$req_01 = "SELECT MAX(date) FROM maTable";
$res_01 = mysql_query($req_01 , $serveur)  or die ('ERR_10 : '.mysql_error() );

while($row = mysql_fetch_array($res_01))
{
$date_1 = $row['MAX(date)'];
}
2°/Je suprime de maTable, la date sélectionnée
DELETE FROM maTable  WHERE date = '$date_1'";


3°/Je sélectionne la deuxième plus grande date $date_2 que je vais soustraire à la $date_1 pour obtenir mon écart ou intervalle. Je calcule donc la différence entre les 2 valeurs.
$req_02 = "SELECT MAX(date) FROM maTable";
$res_02 = mysql_query($req_02, $serveur)  or die ('ERR_11 : '.mysql_error() );

while($row = mysql_fetch_array($res_02))
{
$date_2 = $row['MAX(date)'];
}
4°/Je suprime de maTable, la 2ème date sélectionnée
DELETE FROM maTable  WHERE date = '$date_2'";


5°/ Pour calculer l'écart je fais
$ecart_1 = $date_1 - $date_2;
$ecart_2 = $date_2 - $date_3;
$ecart_3 = $date_3 - $date_4;
$ecart_4 = $date_4 - $date_5;.................etc


==>Je pourrais mettre ma requête dans une boucle FOR qui exécuterait le script jusqu'au vidage complet de maTable. Et les ecarts seront enregistrés dans une autre table appelée "ecarts".

Je trouve ce code alourdit et ralentit les requêtes (je me trompe peut-être), c'est ça que je cherche A FAIRE + SIMPLE ET + RAPIDE.
Si vous avez de meilleures solutions merci d'avance.

Joce

Mammouth du PHP | 2278 Messages

16 nov. 2013, 10:39

Et dans un tableau PHP si les écarts doivent être conservés?
$ecart_max = 0;
$ecart_min = 999999;
$nb= 0;
$somme_ecarts =0;
Boucle
au fur à mesure que tu lis le résultat de ta requête:
si nb = 0
ancien = 0;
nouveau = valeur lue
sinon
ancien = nouveau
nouveau = valeur lue
finsi
tu incrémentes $nb;

tu calcules l'écart ($ecart) et tu le stockes dans un tableau $ecarts
tu compares l'écart avec $ecart_max er $ecart-min et tu changes les valeurs qu'il faut
$somme_ecarts += $ecart
finboucle
Après la boucle tu divises $somme_ecarts / $nb (ou $nb -1)
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

16 nov. 2013, 11:29

Une procédure stockée c'est du code stocker le serveur sgbd qui est exécuté au sein du sgbd.
Pour ce genre se sera forcément plus rapide que n requête de php vers le serveur.
Et suivant le sgbd il possible de retourner un curseur et donc une liste de données ( mais pourquoi pas un tableau tant que c'est exploitable côté php).

Sinon en php comme en SQL tu peux récupérer un enregistrement précis donc l'enregistrement et l'enregistrement suivant au même instant dans la boucle du coup pas besoin de s'emmerder avec n delete qui vont ralentir et polluer la chose.
Un select avec un order by lechamp desc puis la moulinette de calcule devrait suffire.

@+
Il en faut peu pour être heureux ......