2013-06-27 3 views
1

J'ai utilisé la requête PostgreSQL suivante pour trouver le décalage horaire entre l'heure de fin et l'heure de début suivante avec différents ID source.Comment mettre à jour le résultat de la requête SQL dans une colonne séparée

SELECT obu_id, trip_id, start_time, end_time, dwell_time 
    , end_time - LEAD(start_time) OVER(PARTITION BY obu_id ORDER BY start_time) AS diff 
FROM clean_trips_byobu; 

Ce que je suis en train de faire est de mettre à jour la dwell_time colonne avec les résultats étant présentés dans diff (résultat temporaire, son pas stocké partout) et d'insérer une valeur « -1 » comme au lieu de l'espace vide. S'il vous plaît se référer à la capture d'écran suivante.

ScreeShot

Résultat souhaité:

obu_id trip_id start_time   end_time    dwell_time diff 
2  135736 2004-10-29 15:22:14 2004-10-29 16:13:37 -02:01:42 -02:01:42 
2  135738 2004-10-29 18:15:19 2004-10-29 18:28:37 -1 
3  137826 2005-03-17 17:56:41 2005-03-17 18:02:31 -00:05:30 -00:05:30 
3  137826 2005-03-17 18:08:01 2005-03-17 18:12:10 -00:07:51 -00:07:51 
3  137826 2005-03-17 18:20:01 2005-03-17 18:27:51 -14:51:24 -14:51:24 

Répondre

1

Votre question est difficile à analyser. Voici ma éduquée deviner ce que vous pourriez être après:

UPDATE clean_trips_byobu c 
SET dwell_time = COALESCE(u.diff, interval '-1 hour') 
FROM (
    SELECT id, ref, start_time, end_time 
     ,end_time - lead(start_time) OVER(PARTITION BY id 
              ORDER BY start_time) AS diff 
    FROM clean_trips_byobu 
    ) u 
WHERE (c.id, c.ref, c.start_time, c.end_time) 
    =(u.id, u.ref, u.start_time, u.end_time) 
AND c.dwell_time IS DISTINCT FROM COALESCE(u.diff, interval '-1 hour'); 
  • Utilisez COALESCE() pour remplacer NULL avec un défaut interval. Utilisez la requête en tant que sous-requête dans votre UPDATE. Rejoignez-nous sur un ensemble unique de colonnes.

  • Si vous avez déjà des valeurs dans diff, ajoutez la dernière ligne pour éviter les mises à jour vides.

Mais vous devriez vraiment avoir un moyen plus simple d'identifier une ligne que la combinaison de 4 colonnes. Je suggère une clé primaire de substitution. Peut être fait avec cette ligne de code:

ALTER TABLE clean_trips_byobu ADD COLUMN ctb_id serial PRIMARY KEY; 

Plus dans cette réponse étroitement liée:
Do I need a primary key for my table, which has a UNIQUE (composite 4-columns), one of which can be NULL?

+0

Je l'ai essayé mais son montrant encore l'erreur suivante: ERREUR: COALESCE types d'intervalle et entier ne peut pas être apparié. S'il vous plaît laissez-moi savoir comment surmonter cette erreur. Merci beaucoup pour l'aide – ParveenArora

+1

@ParveenArora: Eh bien, votre question n'a pas fourni le type de données de la colonne, et vous n'avez pas fourni une valeur correcte, juste "-1". Mettez un peu plus d'effort s'il vous plaît. J'ai ajouté une solution possible. Peut encore être incompatible avec votre type de colonne. –

+1

Cher @Erwin Brandsetter Je suis désolé pour la confusion dans mon précédent. J'ai mis à jour la question au mieux de mes besoins, s'il vous plaît jeter un oeil. Toutes mes excuses! – ParveenArora

Questions connexes