Vous n'êtes pas identifié(e).
Pages : 1
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
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
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
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
avec un case :
SELECT
...
CASE WHEN b = 0 THEN
0
ELSE
a/b
END as calcul,
...
Hors ligne
C'est vrai, je suis bête :-(
Merci Arthurr.
Hors ligne
Pages : 1