[英]Postgres SQL update one table column based on calculation of the other table's field
我有以下两个表,我想用相应的time_table的sum(end-start)计算结果更新date_table的total字段。
date_table
id name date total
1 xx 2016-02-01
2 yy 2016-02-02
time_table
id date_id start end
1 1 2016-02-01 08:00:00 2016-02-01 11:00:00
2 1 2016-02-01 14:00:00 2016-02-01 20:00:00
3 2 2016-02-02 08:00:00 2016-02-02 11:00:00
4 2 2016-02-02 14:00:00 2016-02-02 20:00:00
因此,结果将是date_table的第一条记录,总计为:
(2016-02-01 11:00:00 - 2016-02-01 08:00:00) + (2016-02-01 20:00:00 - 2016-02-01 14:00:00)
两个表与date_id
是这样的吗?
Update date_table
SET date_table.total =
(
SELECT
sum(time_table.end - time_table.start)
FROM time_table
WHERE
date_table.id = time_table.date_id
)
不太清楚Postgres如何减去日期时间?
我假设date_table
中total
字段的数据类型是integer
并且您的预期输出是
id name date total
-- ---- ---------- -----
1 xx 2016-02-01 9
2 yy 2016-02-02 9
所以,
select dteend-dtestart col
from time_table;
将产生输出作为interval
数据类型
即
col
interval
--------
03:00:00
06:00:00
03:00:00
06:00:00
您不能直接在时间间隔上执行聚合函数。可以使用以下方法以整数数据类型获取时间间隔。
select date_id, sum(EXTRACT(epoch FROM dteend-dtestart)/3600)::int
from time_table
group by date_id;
输出:
date_id sum
------- ---
1 9
2 9
并且更新应如下所示。
UPDATE date_table
SET total = t.sum
FROM (
SELECT date_id
,sum(EXTRACT(epoch FROM dteend - dtestart) / 3600)::INT
FROM time_table
GROUP BY date_id
) t
WHERE date_table.id = t.date_id;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.