Vous n'êtes pas identifié(e).

#1 13/05/2014 11:35:47

mortimer.pw
Membre

Auto-jointure et Horodatage

Bonjour tout le monde,
Je travaille sous CenOS 5.4 avec un moteur PostgreSQL 9.3.2.
J'ai une table dans laquelle je stocke des actions et le moment où cette action est faite (current_timestamp) :
    CREATE TABLE ma_table(
        now timestamp with time zone,
        action character varying(3));
Contenu de ma table :
    "2014-05-13 10:57:14.209095+02";"01"
    "2014-05-13 10:59:47.221529+02";"02"
    "2014-05-13 11:00:28.773153+02";"03"
    "2014-05-13 11:05:25.814538+02";"04"
Je voudrai afficher le temps passé entre 2 actions en utilisant une auto-jointure :
    SELECT A.now AS Debut,B.now-A.now AS Temps,A.action
    FROM ma_table A INNER JOIN ma_table B ON B.now>A.now
    ORDER BY A.now;
Le résultat n'est pas celui attendu :
    "2014-05-13 10:57:14.209095+02";"00:02:33.012434";"01"
    "2014-05-13 10:57:14.209095+02";"00:03:14.564058";"01"
    "2014-05-13 10:57:14.209095+02";"00:08:11.605443";"01"
    "2014-05-13 10:59:47.221529+02";"00:00:41.551624";"02"
    "2014-05-13 10:59:47.221529+02";"00:05:38.593009";"02"
    "2014-05-13 11:00:28.773153+02";"00:04:57.041385";"03"
Quelqu'un a t'il une idée ? pour ne traiter qu'une fois chaque ligne ?
D'avance merci pour votre aide.

Hors ligne

#2 13/05/2014 14:36:46

arthurr
Membre

Re : Auto-jointure et Horodatage

bonjour,

Pas très joli ma ça doit fonctionner :

Select a.now,(select b.now from ma_table b where b.now>a.now order by b.now limit 1) - a.now as temps, a.action from ma_table a order by a.now; 

Dernière modification par arthurr (13/05/2014 14:49:47)

Hors ligne

#3 13/05/2014 14:53:49

arthurr
Membre

Re : Auto-jointure et Horodatage

la même en "propre" :

Select a.now, (lead(a.now,1) over(order by a.now))-a.now as temps, a.action from ma_table a order by a.now;

Avec des données :

test=# select * from ma_table ;
            now             | action 
----------------------------+--------
 2014-05-13 14:41:19.111753 | 01
 2014-05-13 13:41:34.645092 | 02
 2014-05-13 15:41:39.804745 | 03
 2014-05-13 17:48:44.120593 | 04
(4 rows)

test=# Select a.now, (lead(a.now,1) over(order by a.now))-a.now as temps, a.action from ma_table a order by a.now;
            now             |      temps      | action 
----------------------------+-----------------+--------
 2014-05-13 13:41:34.645092 | 00:59:44.466661 | 02
 2014-05-13 14:41:19.111753 | 01:00:20.692992 | 01
 2014-05-13 15:41:39.804745 | 02:07:04.315848 | 03
 2014-05-13 17:48:44.120593 |                 | 04
(4 rows)

Hors ligne

#4 14/05/2014 10:22:22

mortimer.pw
Membre

Re : Auto-jointure et Horodatage

Bonjour Arthurr,
Merci pour la réponse, cela fonctionne bien.
J'ai une petite question subsidiaire : je dois ajouter d'autres colonnes dans ma table avec des valeurs numériques, sur lesquelles je souhaite faire des calculs du style addition, soustraction et division.
     CREATE TABLE ma_table (
       now timestamp with time zone,
       action character varying(3),
       nb1_action integer,
       nb2_action integer);
Nouveau contenu de ma table :
     "2014-05-13 10:57:14.209095+02";"01";0;0
     "2014-05-13 10:59:47.221529+02";"02";0;0
     "2014-05-13 11:00:28.773153+02";"03";1;3
     "2014-05-13 11:05:25.814538+02";"04";4;2
La requête suivante :
     Select a.action,
     a.now,
     date_trunc('second',((lead(a.now,1) over(order by a.now))-a.now)) as temps,
     date_trunc('second',((lead(now,1) over(order by now))-now)/(((lead(nb1_action,1) over(order by now))-nb1_action)+((lead(nb2_action,1) over(order by now))-nb2_action))) AS calcul
     from ma_table a
     order by a.now;
Me retourne le message d'erreur "division by zero".
Comment faire pour tester que le diviseur de mon calcul est supérieur à zéro ?
Encore merci pour votre aide.

Hors ligne

#5 14/05/2014 10:38:14

arthurr
Membre

Re : Auto-jointure et Horodatage

avec un case :

SELECT
...
CASE WHEN b = 0 THEN
 0
ELSE
 a/b
END as calcul,
...

Hors ligne

#6 14/05/2014 12:13:53

mortimer.pw
Membre

Re : Auto-jointure et Horodatage

C'est vrai, je suis bête :-(
Merci Arthurr.

Hors ligne

Pied de page des forums