2016-10-26 9 views
0

私は6つのカラムを持つ2つのテーブルを持っていますが、1つのテーブル(更新したいもの)には最初の3つのカラムが既に挿入されています。空である。ヌルを含む別のテーブルのデータからテーブル内の複数のカラムを更新

概要テーブル

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テーブルのそれらのカラムに値を設定します。両方のテーブルには何千ものエントリがあり、毎日100万に近いものがあります。

結果は、私はそれが私がthis questionから得た情報を使って少しずつ行うことができます

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

に要約テーブルの変更する必要がありますが、私は一度にすべてをやりたいです。 助けてください。このような

+0

日別テーブルの「最後の」行はどのようにして識別できますか?私はタイムスタンプなど何も表示されません –

+0

@a_horse_with_no_nameそれらは行番号が付けられています。申し訳ありませんが今は6つの列になっています。私は編集を行います。 – 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

あなたは、各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でより速くなります。また、Postgresでは、joinを使った 'update'構文が異なります。あなたは 'from'節でターゲットテーブルを**繰り返さないべきです**。 –

+0

良いキャッチ。ありがとう!私は、SQL Serverが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

から更新概要SET重量= _weight、体積= _volume、密度= _density ( SELECT ID _ID、重量_weight、ボリューム_volume、数は(詳細からMAX(番号)を選択詳細 FROM密度_density GROUP BY ID) ) WHERE ID = _ID

関連する問題