Calcul de la différence de temps entre deux tuples

Résolu
lofo18 Messages postés 30 Date d'inscription mardi 19 avril 2005 Statut Membre Dernière intervention 29 septembre 2010 - 8 juin 2007 à 11:36
lofo18 Messages postés 30 Date d'inscription mardi 19 avril 2005 Statut Membre Dernière intervention 29 septembre 2010 - 19 juin 2007 à 10:07
Bonjour tout le monde!

Dans le cadre d'un projet pour le domaine médical,
Je dois calculer le temps moyen entre deux interventions,
mais je bloque complétement, je n'arrive pas à faire la différence seulement entre deux tuples qui ce suivent
sans la faire sur tous les autres...

voici un exemple d'une table dans laquelle je doit effectuer ce calcul:

HEURE_DEBUT          HEURE_FIN   

22/01/1997 10:51:24    22/01/1997 11:35:46
28/06/2000 10:02:23    28/06/2000 10:45:18
24/04/2007 13:31:07    24/04/2007 13:33:26
25/04/2007 11:53:25    25/04/2007 11:55:58
25/04/2007 13:01:32    25/04/2007 13:03:20
26/04/2007 09:45:26    26/04/2007 09:54:45
26/04/2007 10:28:11    26/04/2007 10:32:58
02/05/2007 11:18:43    02/05/2007 11:18:54
02/05/2007 13:09:34    02/05/2007 13:09:50
02/05/2007 13:10:24    02/05/2007 13:10:55
02/05/2007 13:14:41    02/05/2007 13:15:06
14/05/2007 15:51:28    14/05/2007 16:00:10

j'ai beaucoup cherché sur internet, mais je n'ai trouvé personne confronté au meme
probleme que moi.

si quelqu'un à une idée pour m'aiguiller je lui en serai infiniment reconnaissant

Par avance, merci.

7 réponses

nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Modérateur Dernière intervention 15 juillet 2011 37
11 juin 2007 à 19:44
Si tu joue avec ta clé primaire ca doit le faire?

WHERE H1.IDINTERV = H2.IDINTERV +1
En esperant qu'il se suive?
3
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Modérateur Dernière intervention 15 juillet 2011 37
11 juin 2007 à 22:13
Salut

Tu peux rajouter le numero de ligne a des deux tables.

Attention c'est vraiement de la bidouille et ca doit bouffé en performance de manière importante.

a moins de creer une colonne.
Qui te numerote les lignes avant la requete,
while pas fin des enregsitrement
macolonnerownumber = i + 1

Pour la table et la tu n'as plus de trou car elles sera mis en permanence en route avant ton calcul.

NB si nbenregistrement = max(macolonnerownumber) [- 1] dependant si tu es base en base 0 ou 1 pour ton indexage de ta colonne de numero de ligne.

pas la peine de refaire l'update.

Bon courage.

Extrait d'un post google group

Si tu as une cle primaire
SELECT (SELECT Count(theField) + 1 FROM tblSource AS A WHERE A.TableID
< B.TableID) As RowNumber, TableID, theField
FROM tblSource AS B;

Sinon

Public Function LineNum(lngFldVal As Long, strSource As String, strKey
As String) As Long
Dim strCrit As String
strCrit = "[" & strKey & "] < " & CStr(lngFldVal)
LineNum = Nz(DCount(strKey, strSource, strCrit)) + 1
End Function

Then it can be called like:

SELECT LineNum([TableID],"tblSource","TableID") AS RowNumber, TableID,
theField FROM tblSource;

SELECT LineNum([QID], "qryNew", "QID") As RowNumber, * FROM qryNew;

Note: One way to get a unique QID is to use the key from a source
table (qryNew: SELECT tblSource.TableID AS QID...). I also tried an
old query I had lying around as qryNew :-):

qryNew:
SELECT qryOrdinalIPs.IP AS IP1, qryOrdinalIPs.ID
FROM tblIPs INNER JOIN qryOrdinalIPs ON tblIPs.ID = qryOrdinalIPs.ID
WHERE (((qryOrdinalIPs.theOrdinal)=1))
GROUP BY qryOrdinalIPs.IP, qryOrdinalIPs.ID;

SELECT LineNum([ID], "qryNew", "ID") As RowNumber, * FROM qryNew;
3
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Modérateur Dernière intervention 15 juillet 2011 37
10 juin 2007 à 22:42
Salut

Je ne comprends pas la phrase
différence seulement entre deux tuples qui ce suivent

Regardes la focntion datediff pour résoudre ton probleme de difference
0
lofo18 Messages postés 30 Date d'inscription mardi 19 avril 2005 Statut Membre Dernière intervention 29 septembre 2010
11 juin 2007 à 16:50
Salut nhervagault
merci d'avoir pris un peu de temp pour mon problème. et merci pour la fonction datediff que je ne connaissait pas, mais ça ne regle pas complétement mon problème. C'est vrai que je n'ai pas été très clair dans mon explication, je vais essayé d'étre plus précis
 ID INTERV      HEURE_DEBUT(HD)          HEURE_FIN  (HF)
          1               22/01/1997 10:51:24                22/01/1997 11:35:46
          2               28/06/2000 10:02:23                28/06/2000 10:45:18
          3               24/04/2007 13:31:07                24/04/2007 13:33:26
          4               25/04/2007 11:53:25                25/04/2007 11:55:58
          5               25/04/2007 13:01:32                25/04/2007 13:03:20

(c'est le meme exemple que décrit plus haut, mais avec un identifiant, ce sera plus facile)
Ce que je voudrai réaliser c'est une moyenne du temps qui sépare deux interventions soit:
    HeureDebut de l'interv 2   moins  HeureFin  de l'interv 1  
    HeureDebut de l'interv 3   moins  HeureFin  de l'interv 2
    HeureDebut de l'interv 4   moins  HeureFin  de l'interv 3    etc....
pour réaliser la moyenne de ce calcul.
Avec cette requete:
    select  DISTINCT (H1.HEURE_DEBUT) , H1.HEURE_FIN ,H2.HEURE_DEBUT, H2.HEURE_FIN,            
    cdate(H2.HEURE_DEBUT - H1.HEURE_FIN) as "Temp" 
    From  INTERVENTION as H1 INNER JOIN INTERVENTION as H2 on (H1.HEURE_DEBUT <> H2.HEURE_DEBUT)

j'ai obtenu la différence entres tous les tuples:
    HD interv2 - HF interv1
    HD interv2 - HF interv3
    HD interv2 - HF interv4 etc....
alors que je voudrai juste faire la difference entre le tuple (2 et 1), (3 et 2) etc...
(d'où ma phrase "je n'arrive pas à faire la différence seulement entre
deux tuples qui ce suivent sans la faire sur tous les autres...")
j'espère avoir été un peu plus clair.
encor merci à ceux qui consacreront un peu de temps à ce problème.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lofo18 Messages postés 30 Date d'inscription mardi 19 avril 2005 Statut Membre Dernière intervention 29 septembre 2010
11 juin 2007 à 20:41
En théorie la solution que tu ma donné marche très bien, et je n'avai  pas dutout pensé à ce genre de solution
malheureusement, je me suis aperçu que certaine intervention peuvent être effacée, et de ce fait, leur clé primaire aussi...
donc impossible de savoir si H1.IDINTERV = H2.IDINTERV +1
mais merci quand meme, ça fait deux chose que tu m'apprend ^^
(je début un peu en sql comme tu as du le remarquer)
je vais continuer à chercher, et si je trouve une solution, je la posterai ici. ça pourra peut etre aider quelqu'un (si je trouve....)
0
lofo18 Messages postés 30 Date d'inscription mardi 19 avril 2005 Statut Membre Dernière intervention 29 septembre 2010
18 juin 2007 à 12:17
Salut et désolé d'avoir mis autant de temps pour répondre.
Mais un GRAND merci à toi, pour le temps que tu as consacré à mon probleme, et surtout à la solution que tu m'as donnée.

avec

SELECT (SELECT Count(theField) + 1 FROM tblSource AS A
WHERE A.TableID< B.TableID) As RowNumber, TableID, theField
FROM tblSource AS B;

j'ai pu numéroter tous mes tuples avec des numéros qui se suivent , et avec

WHERE H1.IDINTERV = H2.IDINTERV +1

j'ai pu réaliser la différence de temps entre deux patients.

encor merci!!!!
0
lofo18 Messages postés 30 Date d'inscription mardi 19 avril 2005 Statut Membre Dernière intervention 29 septembre 2010
19 juin 2007 à 10:07
Si ça interesse quelqu'un, voila la requête que j'ai obtenu,
j'espere que ça pourra être utils pour quelqu'un bien que ce soit assé spécifique.

Select cdate(R2.HEURE_DEBUT - R1.HEURE_FIN) as 'Temp Entre deux Intervention'
from (
    Select (
        SELECT Count (HEURE_DEBUT)+  1
        FROM (
                SELECT distinct(HEURE_DEBUT), HEURE_FIN
                FROM INTERVENTION
                WHERE HEURE_DEBUT IS NOT NULL
                AND HEURE_FIN IS NOT NULL) AS H1
       WHERE H1.HEURE_DEBUT < H2.HEURE_DEBUT
    ) As IDTMP,H2.HEURE_DEBUT, H2.HEURE_FIN
    FROM(
        SELECT distinct(HEURE_DEBUT), HEURE_FIN
        FROM
        INTERVENTION
        WHERE HEURE_DEBUT IS NOT NULL
        AND HEURE_FIN IS NOT NULL) AS H2
    WHERE H2.HEURE_DEBUT IS NOT NULL
    AND H2.HEURE_FIN IS NOT NULL) as R1,
    (
    Select (
        SELECT Count (HEURE_DEBUT)+  1
        FROM (
                SELECT distinct(HEURE_DEBUT), HEURE_FIN
                FROM INTERVENTION
                WHERE HEURE_DEBUT IS NOT NULL
                AND HEURE_FIN IS NOT NULL) AS H1
        WHERE H1.HEURE_DEBUT < H2.HEURE_DEBUT
    ) As IDTMP,H2.HEURE_DEBUT, H2.HEURE_FIN
    FROM(
        SELECT distinct(HEURE_DEBUT), HEURE_FIN
        FROM
        INTERVENTION
        WHERE HEURE_DEBUT IS NOT NULL
        AND HEURE_FIN IS NOT NULL) AS H2
    WHERE H2.HEURE_DEBUT IS NOT NULL
    AND H2.HEURE_FIN IS NOT NULL) AS R2

WHERE R1.IDTMP+1 = R2.IDTMP

Bon Courage à tous!!
0
Rejoignez-nous