Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/09/2011, 12h42   #1
Invité de passage
 
Inscription : octobre 2004
Messages : 10
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 10
Points : 1
Points : 1
Par défaut Optenir un temps moyen d'intervalle de création

Bonjour à tous,

En temps normal je me débrouille tout seul comme un grand mais là j'avoue que je commence à être à court d'idée.
Je vous expose mon problème.

J'ai une table contenant des clients (1 entrée = 1 client) et pour chaque client j'ai une date de création sous la forme d'un datetime.

Je voudrai pouvoir récupérer un temps moyen d'écart entre les dates de créations de chacun d'entre eux. Histoire de pouvoir me sortir une stat du genre "un client a été crée toutes les 8 minutes en moyenne entre la date X et la date Y"

J'ai regardé pas mal de trucs, il y a timediff(t1, t2) qui collerait bien, mais il implique d'avoir 2 dates a convertir en time sur un champ, chose que je n'ai pas.

J'ai aussi tenté de récupérer l'enregistrement précédent et de faire un timediff mais c'est moyen et ne retourne pas ce que je veux et dans tous les cas je devrai passer le tout à un AVG() pour faire une moyenne... je dois pas lui poser la bonne question.

Quelqu'un aurait une idée de requete pour moi ?

Merci
Denis Dee Jay est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/09/2011, 13h21   #2
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

Informations professionnelles :
Activité : Retraité
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
Saluton,
Je pense à quelque chose comme ça
Code mysql :
1
2
3
4
5
6
7
8
9
SELECT AVG(TIMEDIFF(c.creation,
                    (SELECT creation 
                     FROM clients 
                     WHERE creation > c.creation 
                     ORDER BY creation 
                     LIMIT 1)
                    )
           )
FROM clients c
Le problème va concerner le dernier client entré pour lequel la sous-requête ne retournera pas de valeur.
Et donc soit il y a un message d'erreur, soit AVG retounera une valeur décalée
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
articles : Comment émuler un tableau croisé [quasi] dynamique
et : Une énigme mathématique résolue avec MySQL
recommande l'utilisation de PDO (PHP5 Data Objects)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/09/2011, 13h28   #3
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

Informations professionnelles :
Activité : Retraité
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
Par ailleurs, je ne suis pas sûr que AVG sache travailler sur le résultat de TIMEDIFF.
Il faut probablement le convertir en secondes avec TIME_TO_SEC.
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
articles : Comment émuler un tableau croisé [quasi] dynamique
et : Une énigme mathématique résolue avec MySQL
recommande l'utilisation de PDO (PHP5 Data Objects)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/09/2011, 14h55   #4
Invité de passage
 
Inscription : octobre 2004
Messages : 10
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 10
Points : 1
Points : 1
Salutations et merci du message

Bizarre, j'avais testé de passer par une sous requete mais la partie "WHERE creation > c.creation" ne fonctionnait pas, j'arrivais pas à lui donner la valeur de c.creation. Peut être parce que ma sous requete était au niveau de ma jointure et pas directement dans le select.

J'ai fais mes tests et comparé avec des données calculées à la main et tout roule, merci bien.

Un exemple de requetes essayée :

Code :
1
2
3
4
5
6
7
8
9
10
11
SELECT (AVG(TIMEDIFF(c.crea_date,
                    (SELECT crea_date 
                     FROM clients__tech 
                     WHERE crea_date >= c.crea_date 
			AND client_id != c.client_id 
                     ORDER BY crea_date ASC 
                     LIMIT 1)
                    )
           ) / 60) AS minutes 
FROM clients__tech c
WHERE client_id >= 744
Qui me retourne bien un :
Citation:
8.02820512820513
C'est tout ce que je voulais. Merci beaucoup
Denis Dee Jay est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h41.


 
 
 
 
Partenaires

Hébergement Web