2016-10-26 33 views
0

我有两个包含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表中获取最后的体重,体积,密度值,并使用它们来填充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

如何识别日常表中的“最后”行?我没有看到任何时间戳或类似的东西 –

+0

@a_horse_with_no_name它们是行数,抱歉应该是六列现在我明白你的意思了,我会编辑 – Kilisi

回答

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最高的“数字”返回行。对于看

在线例如解决的其他方式:http://rextester.com/AWT29305

+0

适合我的需求,很好很简单 – Kilisi

1

你可以使用一个窗口funtion让你的日常表中的每个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; 
+0

Postgres需要' ;'最后,不是在开始。在使用'distinct on()'而不是窗口函数时,Postgres中的“每个组的最大n值”问题通常更快。 Postgres中带有连接的'update'语法是不同的。你不应该**在'from'子句中重复目标表。 –

+0

好的。谢谢!我想知道sql服务器是否具有与postgres的distinct on()相同的功能。这是一个很好的功能。 – SteveR

+0

我冒昧地修复了您的陈述中的语法错误。 –

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正确的最新的记录,只有那些需要更新。

+0

CTE中的窗口函数也应该可以工作 – HLGEM

+0

花了我一段时间才弄清楚这个问题,但它运行良好 – Kilisi

0

UPDATE摘要SET重量= _weight,体积= _volume,密度= _density FROM ( SELECT ID _ID,重量_weight,体积_volume,密度_density FROM详细 WHERE数IN(SELECT MAX(数)详细GROUP BY ID) ) A WHERE ID = _ID