Page 1 sur 1

calcul intervalle de plusieurs valeurs issues d'un select

Posté : 15 nov. 2013, 19:15
par tjoce05
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:

Re: calcul intervalle de plusieurs valeurs issues d'un selec

Posté : 15 nov. 2013, 20:22
par yann18
les valeurs à soustraire sont-elles des dates?

Re: calcul intervalle de plusieurs valeurs issues d'un selec

Posté : 15 nov. 2013, 21:14
par sirakawa
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

Re: calcul intervalle de plusieurs valeurs issues d'un selec

Posté : 15 nov. 2013, 21:49
par moogli
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 ;)


@+

Re: calcul intervalle de plusieurs valeurs issues d'un selec

Posté : 16 nov. 2013, 08:47
par tjoce05
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

Re: calcul intervalle de plusieurs valeurs issues d'un selec

Posté : 16 nov. 2013, 10:39
par sirakawa
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)

Re: calcul intervalle de plusieurs valeurs issues d'un selec

Posté : 16 nov. 2013, 11:29
par moogli
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.

@+