繁体   English   中英

从另一个表数据(包括空值)更新一个表中的多个列

[英]Update multiple columns in a table from another tables data including nulls

我有两个包含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

我想从“每日”表中获取最后的重量,体积,密度值,并使用它们来填充“摘要”表中的那些列。 这两个表都有成千上万个条目,每天都有接近一百万个条目。

结果应为摘要表更改为

Number, ID, height, weight, volume, density
1       1     5      21      2   
2       2     5      25               8
3       3     12     22      2        6

我可以使用从这个问题中得到的信息来一点一点地做,但是我想一次全部完成。 请协助。

像这样:

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具有最高“数字”的行。 有关其他解决方案,请参见

在线示例: http : //rextester.com/AWT29305

您可以使用加窗功能来获取每日表中每个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;

尝试这个:

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以及仅那些需要更新的ID都获得正确的最新记录。

更新摘要SET重量= _重量,体积= _体积,密度= _密度FROM(选择ID _ID,重量_weight,体积_volume,密度_密度FROM Details WHERE Number IN(SELECT MAX(Number)FROM Details GROUP BY ID))一个WHERE ID = _ID

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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