mam następującej tabeli PostgreSQL 9,2 zawierający znaczniki czasowe:Aktualizacja kolumnę z wynikami zapytania w PostgreSQL
GID [PK] (bigserial) timestamp_mes (znacznik czasu bez strefy czasowej) time_diff (interwał)
1, 2012-01-23 11:03:40, pusty
2, 2012-01-23 11:03:42, pusty
3, 2012-01-23 11:03:44, pusty
Dodałem kolumnę interwałową (time_diff) i chciałbym ją wypełnić wartościami różnicy czasu wynikającymi z t Jego zapytania:
SELECT timestamp_mes - lag(timestamp_mes, 1)
over (order by timestamp_mes) as diff
from gc_entretien.trace order by timestamp_mes
Próbowałem następującą kwerendę, aby zaktualizować kolumny time_diff, bez powodzenia:
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);
Wynika to z błędu:
ERROR: more than one row returned by a subquery used as an expression
Jak należy postępować zaktualizować kolumnę time_diff wartościami wynikającymi z zapytania o różnicę czasu?
Nie jestem pewien co do logiki Twojej aplikacji, ale opcja zwraca prawdopodobnie więcej wierszy, co powoduje błąd, gdy przypisywanie do s ingle kolumna (jak robisz w 'UPDATE') ... jeśli wynik jest w pierwszym wierszu zwrócone w' WYBIERZ', użyj 'LIMIT 1', aby przydzielić zadanie możliwe. W każdym razie wybór nie wydaje się być poprawnie zaprojektowany. –
@ KamilŠrot - Jest z tym problem; ponieważ podzapytanie jest (obecnie) nieskorelowane, 'LIMIT 1' po prostu zwróci górny wiersz, kropkę, a nie taki, który ma cokolwiek wspólnego z bieżącym wierszem. –
@ Clockwork-Muse, właśnie dlatego mówię, że nie jest poprawnie zaprojektowane zapytanie.Najpierw @jatobat musi utworzyć zapytanie zwracające dokładnie jedną wartość (tę, której potrzebuje zgodnie z logiką aplikacji), a następnie umieścić ją jako podzapytanie w zapytaniu "UPDATE" ... zwykłym scenariuszem jest użycie niektórych identyfikatorów/wartości z tabeli (lub wiersza), które są aktualizowane w podzapytaniu jako warunek (-y) w klauzuli podzapytania "WHERE". Ale szczerze powiedziawszy: nie rozumiem logiki aplikacji, a nawet nie chcę jej zrozumieć :-) –