我有两个表有6列的表,在一个表中(我要更新的那个)前三列已经填充,其他三个我刚刚制作,所以它们是空的。
汇总表
Number, ID, height, weight, volume, density
1 1 5
2 2 5
3 3 12
我有一个完全填充的表格,其中使用了相同的ID,但其他数据波动并且没有高度
每日表
Number, ID, name, weight, volume, density
1 1 c3 23 10
2 2 c17 24.2 1 5
3 3 c12 22 2 6
4 1 c3 21 2
5 2 c17 25 8
我想从Daily表中获取最后一个weight,volume,density值,并使用它们填充Summary表中的那些列。这两个表都有数以千计的条目,每日一个接近一百万。
结果应该是摘要表更改为
Number, ID, height, weight, volume, density
1 1 5 21 2
2 2 5 25 8
3 3 12 22 2 6
我可以使用this question获得的信息一点一点地完成,但我想一次完成所有操作。 请协助。
答案 0 :(得分:3)
这样的事情:
update summary
set weight = t.weight,
volume = t.volume,
density = t.density
from (
select distinct on (id) id, weight, volume, density
from daily
order by id, number desc
) t
where t.id = summary.id;
内部选择将仅返回每日表中具有最高“数字”的每个ID的行。有关其他解决方法,请参阅greatest-n-per-group
答案 1 :(得分:1)
您可以使用窗口功能获取每个ID的每日表中的最新条目。我在SQL Server中对此进行了测试,但我相信postgres的语法在这种情况下是相同的。
With LatestDaily As
(
select *
from (
Select RANK() OVER (Partition By ID ORDER BY Number DESC) as r, *
From Daily
) t
where t.r = 1
)
Update summary s
Set Weight = d.Weight, Volume = d.Volume, Density = d.Density
From LatestDaily d
where s.ID = d.ID;
答案 2 :(得分:1)
试试这个:
with Daily as (
select d.number, d.Id, d.weight, d.volume, d.density
From daily d
join (select id, max(number) from daily group by ID) d2 on d.number = d2.number
)
update Summary
set weight = d2.weight
, volume = d2.volume
, density = d2.density
from Daily d2
where id = d2.id
and
(weight<> d2.weight OR
volume <> d2.volume OR
density <> d2.density)
)
这应该确保您获得每个ID的正确最新记录,并且只有那些需要更新的记录。
答案 3 :(得分:0)
更新摘要SET weight = _weight,volume = _volume,density = _density 从 ( SELECT ID _ID,weight _weight,volume _volume,density _density 来自细节 数字IN(SELECT MAX(数字)FROM详细信息GROUP BY ID) ) 一个WHERE ID = _ID