Vous n'êtes pas identifié(e).
Pages : 1
Bonjour,
J'ai une table commande et une table commande_historique.
Lors de la création de ma commande, j'insère un enregistrement dans ma table commande_historique.
Je fait de même à chaque fois que je change l'état de ma commande.
J'obtiens ainsi :
Table Commande
ID |Etat |User |Prix
1 |Validé |Admin |50
Table Commande_historique
ID |ID_COMMANDE | User |Etat |Date
1 |1 |Client |Créé |2012-01-01 19:50:25
2 |1 |Admin |Accepté |2012-01-02 07:45:17
3 |1 |Client |Modifié |2012-01-02 10:37:01
4 |1 |Admin |Accepté |2012-01-02 14:28:13
5 |1 |Admin |Validé |2012-01-03 08:01:52
Avec ces informations je voudrais pouvoir en une requête produire le résultat suivant :
ID_COMMANDE |Etat |Durée
1 |Créé |0jour 11 heures 54 minutes 52 secondes
1 |Accepté |0jour 02 heures 51 minutes 44 secondes
1 |Modifié |0jour 03 heures 51 minutes 12 secondes
1 |Accepté |0jour 17 heures 33 minutes 39 secondes
Les calculs correspondent au temps écoulés entre deux dates ici toujours moins de 1 jour, mais çà peut parfois être plus.
Si quelqu'un à une solution j'suis preneur.
J'avoue que je me fais des noeuds au cerveau en essayant de résoudre ce cas.
D'avance merci de vos réponses.
HadanMarv
Hors ligne
Le plus simple pour résoudre ça, c'est une Window Function
SELECT id_commande,
username,
etat,
date_evt,lead(date_evt) over (partition by id_commande order by date_evt) - date_evt
from commande_historique ;
id_commande | username | etat | date_evt | ?column?
-------------+----------+---------+------------------------+----------
1 | Client | Créé | 2012-01-01 19:50:25+01 | 11:54:52
1 | Admin | Accepté | 2012-01-02 07:45:17+01 | 02:51:44
1 | Client | Modifié | 2012-01-02 10:37:01+01 | 03:51:12
1 | Admin | Accepté | 2012-01-02 14:28:13+01 | 17:33:39
1 | Admin | Validé | 2012-01-03 08:01:52+01 |
Disponible à partir de PostgreSQL 8.4: http://docs.postgresql.fr/9.1/tutorial-window.html
Marc.
Hors ligne
Bonjour.
Il suffit de joindre la table d'historique sur elle-même :
select deb."ID_COMMANDE",deb."Etat",fin."Date"-deb."Date" as "Durée"
from "Commande_historique" deb
join "Commande_historique" fin on deb."ID_COMMANDE" = fin."ID_COMMANDE"
and deb."ID"+1=fin."ID"
Edit: Effectivement encore plus simple en window function.
Dernière modification par rjuju (17/02/2012 12:39:37)
Julien.
https://rjuju.github.io/
Hors ligne
Et bien quoi dire mise à part merci beaucoup.
J'avoue honnêtement ne rien comprendre à la requête fourni, mais cela fonctionne parfaitement.
Pourriez-vous m'éclairer sur son fonctionnement (partition, lead, over) ?
D'avance merci
HadanMarv
Hors ligne
Le mieux, c'est pour commencer que vous lisiez la page de doc que j'ai mise en lien : http://docs.postgresql.fr/9.1/tutorial-window.html . Elle explique assez bien le principe (même si ce n'est pas évident à appréhender initialement). Si je vous l'explique, je ne ferai que redire ce qui est écrit sur cette page. Si vous avez encore besoin d'éclaircissements après, n'hésitez pas à poser des questions.
Marc.
Hors ligne
Pages : 1