Date interval debut - fin

Date interval debut - fin - SQL/NoSQL - Programmation

Marsh Posté le 22-05-2007 à 15:50:00    

bonjour,
Mon probleme est très simple et en même temp assez compliqué pour rester dans un temp correct de traitement.
J'ai une table d'ouverture/fermeture de lit dans un hopital :
IULIT --- DATE -- MOTIF
1 --- 12/05/07 -- ouvert
1 --- 17/05/07 -- ferme
1 --- 22/05/07 -- ouvert
 
J'aimerais passé cette table sous la forme
IULIT ---date debut --- date fin --- motif
1 --- 12/05/07 --- 17/05/07 --- ouvert
1 --- 17/05/07 --- 22/05/07 --- ferme
1 --- 12/05/07 --- 31/12/99 ou vide --- ouvert
 
j'ai essayé avec mes propres connaissance en SQL mais cela donne une usine à gaz   :pt1cable:  
Quelqu'un peux t'il m'aider ?
Merci d'avance.

Reply

Marsh Posté le 22-05-2007 à 15:50:00   

Reply

Marsh Posté le 22-05-2007 à 15:55:40    

Pas de solution miracle. Celle que tu as mis en place et qui ressemble à une usine à gaz me semble la plus simple...
 
=> Jointure de la table sur elle-même avec "t1.date deb < select min(2.datdeb) where t2.datedeb > t1.datdeb"

Reply

Marsh Posté le 22-05-2007 à 16:34:48    

Sans vouloir faire le gars trop chiant mais je dois me planter quelque part, est il possible d'avoir la requete en "entier" ?
J'ai essayer en reprenant ton bout de requete mais ya un truc qui "coince"...


Message édité par moineaux4476 le 22-05-2007 à 16:35:19
Reply

Marsh Posté le 22-05-2007 à 16:52:37    

Pourquoi tu te contente pas de mettre la date de debut/fin quand il est "ouvert", avec ca tu peux déduire facilement quand il est "fermé".

Reply

Marsh Posté le 22-05-2007 à 17:58:06    

je te poste un truc ce soir, là gigot d'agneau


Message édité par MagicBuzz le 22-05-2007 à 17:58:16
Reply

Marsh Posté le 22-05-2007 à 19:19:39    

Après réflexion rapide, je crois que j'ai trouvé bien plus simple que ce que j'ai dit. A vérifier :
 
Requête 1 :
 

Code :
  1. SELECT t1.iulit, t1.date, min(t2.date), t1.motif
  2. FROM matable t1
  3. LEFT OUTER JOIN matable t2 ON t2.iulit = t1.iulit AND t2.date > t1.date
  4. WHERE t1.iulit = 1 --parceque dans ton exemple y'a que des 1 ;)
  5. GROUP BY t1.iulit, t1.date, t1.motif


 
En fait, à première vue, cette requête toute bête devrait marcher ;)

Reply

Marsh Posté le 22-05-2007 à 22:20:47    

sachant que si tu es sur un sgbd un peu correct tu dois avoir des fonctions analytiques qui te permettent de faire ca sans trop te casser le derriere, genre en oracle, je bosse quasi exclusivement la dessus donc je ne connais pas les autres, mais ca m'etonnerait que mssql n'ait pas un truc du genre.
 

Code :
  1. select iulit,
  2.          statut,
  3.          ta_date date_de_debut,
  4.          lead(ta_date)over(partition by iulit order by ta_date) date_de_fin
  5. from ta_table


 
en gros tu definis une clause de fenetrage, ce qui correspond a toutes tes lignes ayant le meme iulit, il va trier ses fenetres suivant ton critere, et aller rechercher le suivant. Une fois qu'on a gouté a ca difficile de s'en passer
 
marrant je bosse aussi dans un hosto, tu dois sortir des stats sur des unités de soin?

Reply

Marsh Posté le 23-05-2007 à 08:21:33    

bonjour à tous, je m'en vais tester vos solutions, je vous tiens au courant.
 
Ps:casimir, oui c'est pour les unité de soins mais aussi pour tous les autres service de l'hôpital (finance,drh,etc...)
PS: Lephasme, c'est parce que il n'y a pas que les etats ouvert et fermé.

Reply

Marsh Posté le 23-05-2007 à 10:16:32    

ça y est, merci bien.
 
solution retenu : MagicBuzz, simple et efficace.
 
Casimimir, je ne connaissais pas les fonctions analytiques et il est vrai que ça m'a l'air très efficace, malheuresement elle ne fonctionne pas dans mon cas. Je ne sais pas pourquoi, peut être en rapport avec mon lien odbc sur ma base db2, mais en tous cas la solution de magicbuzz fonctionne bien donc pas la peine de chercher plus loin...
 
++

Reply

Marsh Posté le 23-05-2007 à 11:05:54    

ha ben on doit quasiment faire le même job alors ^^

Reply

Marsh Posté le 23-05-2007 à 11:05:54   

Reply

Marsh Posté le 23-05-2007 à 11:24:48    

En fait, c'est le gars assi à côté de toi si ça se trouve :D

Reply

Marsh Posté le 23-05-2007 à 23:37:59    

Ou alors le SGBD qui lui parle  [:barthaliastoxik]

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed