【发布时间】:2012-11-25 21:58:59
【问题描述】:
我在 PostgreSQL 9.2 中有下表,其中包含时间戳:
gid [PK] (bigserial), timestamp_mes (timestamp without time zone), time_diff (interval)
1、2012-01-23 11:03:40,空
2、2012-01-23 11:03:42,空
3、2012-01-23 11:03:44,空
我添加了一个间隔列 (time_diff),并希望用此查询产生的时差值填充它:
SELECT timestamp_mes - lag(timestamp_mes, 1)
over (order by timestamp_mes) as diff
from gc_entretien.trace order by timestamp_mes
我尝试了以下查询来更新 time_diff 列,但没有成功:
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);
这会导致错误:
错误:用作表达式的子查询返回多行
我应该如何使用时差查询产生的值更新 time_diff 列?
【问题讨论】:
-
不确定您的应用程序的逻辑,但选择可能返回更多行,这在分配到单列时会导致错误(就像您在
UPDATE中所做的那样)...如果结果在在您的SELECT返回的第一行,使用LIMIT 1使分配成为可能。无论如何,选择似乎没有正确设计。 -
@KamilŠrot - 这有问题;因为子查询(当前)不相关,
LIMIT 1将只返回顶行,句点,而不是与当前行有任何关系的。 -
@Clockwork-Muse 对,这就是为什么我说它的查询设计不正确。首先@jatobat 需要创建一个查询返回恰好一个值(根据应用程序逻辑他需要的那个),然后将其作为子查询放入
UPDATE查询......通常的情况是使用表中的一些标识符/值(相应的行)在子查询中被更新为子查询WHERE子句中的条件。但坦白说:我不懂应用程序的逻辑,甚至不想理解它:-)
标签: sql database postgresql sql-update postgresql-9.2