lofo18
Messages postés30Date d'inscriptionmardi 19 avril 2005StatutMembreDernière intervention29 septembre 2010
-
8 juin 2007 à 11:36
lofo18
Messages postés30Date d'inscriptionmardi 19 avril 2005StatutMembreDernière intervention29 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:
nhervagault
Messages postés6063Date d'inscriptiondimanche 13 avril 2003StatutModérateurDernière intervention15 juillet 201137 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;
lofo18
Messages postés30Date d'inscriptionmardi 19 avril 2005StatutMembreDernière intervention29 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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
lofo18
Messages postés30Date d'inscriptionmardi 19 avril 2005StatutMembreDernière intervention29 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....)
lofo18
Messages postés30Date d'inscriptionmardi 19 avril 2005StatutMembreDernière intervention29 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.
lofo18
Messages postés30Date d'inscriptionmardi 19 avril 2005StatutMembreDernière intervention29 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