Mise à jour d'une colonne avec les résultats d'une requête dans PostgreSQL

J'ai le tableau suivant dans PostgreSQL 9.2, qui contient des timbres:

gid [PK] (bigserial), timestamp_mes (timestamp sans fuseau horaire), time_diff (intervalle)
1, 2012-01-23 11:03:40, vide
2, 2012-01-23 11:03:42, vide
3, 2012-01-23 11:03:44, vide

J'ai ajouté un intervalle de colonne (time_diff) et tiens à le remplir avec le temps les valeurs de la différence résultant de cette requête:

SELECT timestamp_mes - lag(timestamp_mes, 1) 
over (order by timestamp_mes) as diff
from gc_entretien.trace order by timestamp_mes

J'ai essayé la requête suivante pour mettre à jour le time_diff colonne, sans succès:

UPDATE gc_entretien.trace set time_diff = 
(SELECT trace.timestamp_mes - lag(trace.timestamp_mes, 1) 
over (order by trace.timestamp_mes) 
from gc_entretien.trace order by timestamp_mes);

Cela entraîne une erreur:

ERREUR: plus d'une ligne renvoyée par une sous-requête en tant qu'expression

Comment dois-je procéder pour mettre à jour le time_diff colonne avec les valeurs résultant de la différence de temps de requête?

Pas sûr au sujet de la logique de votre application, mais la sélection retourne peut-être plus les lignes qui provoque une erreur lors de l'affectation dans une seule colonne (comme vous le faites dans votre UPDATE)... si le résultat est en première ligne renvoyée dans votre SELECT, utilisez LIMIT 1 à procéder à la cession possible. De toute façon le select ne semble pas être correctement conçus.
Il y a un problème avec ça; parce que la sous-requête est (pour l'instant) pas corrélés, LIMIT 1 va juste retourner la rangée du haut, de la période, pas un seul qui n'a rien à voir avec la ligne actuelle.
à droite, c'est pourquoi je dis qu'il n'est pas correctement conçu requête. D'abord @jatobat besoin de créer une requête qui renvoie exactement une valeur (celle qu'il a besoin en fonction de la logique d'application) puis la mettre comme sous-requête dans UPDATE requête... d'habitude le scénario est d'utiliser certaines informations sur les valeurs de la table (resp. ligne) cours de mise à jour dans la sous-requête en tant que condition(s) dans la sous-requête WHERE clause. Mais franchement dit: je ne comprends pas la logique de l'application et même ne veux pas comprendre 🙂

OriginalL'auteur jatobat | 2012-12-07