繁体   English   中英

Postgres SQL根据对另一个表字段的计算来更新一个表列

[英]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_tabletotal字段的数据类型是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM