Postgresql

Postgresql 按分組列更新表行值

  • October 24, 2016

首先介紹一點背景:

我目前有一個表,其中包含來自我的業務的入站和出站呼叫數據,直到最近還沒有可用的api_id數據,但是這是我的供應商 API 的最後更新,因此我有一些歷史呼叫數據可以按call_id分組。

我要做的是更新數據庫中沒有 api_id 的現有行,並使用隨機字元串將它們按 call_id 分組。

| ... | call_id | api_id |
|------------------------|
| ... | 123 | AAA |
| ... | 456 | |
| ... | 456 | |
| ... | 788 | |
| ... | 789 | |
| ... | 789 | |

然後會變成:

| ... | call_id | api_id |
|------------------------|
| ... | 123 | AAA |
| ... | 第456章 全球健康聯盟 |
| ... | 第456章 全球健康聯盟 |
| ... | 788 | ZPM |
| ... | 第789章 LFF |
| ... | 第789章 LFF |

通過分組查詢有效地進行更新,我已經進行了搜尋但找不到任何東西。

如果這裡的任何人可以幫助或指出我正確的方向,將不勝感激。

數據庫技術:Postgresql 9.5.4

簡單的答案 - 因為虛擬值api_id無關緊要:使用call_id

update the_table 
   set api_id = call_id::text 
where api_id is null;

複雜的答案:

假設您有某種生成隨機字元串的方法,您可以執行以下操作(未經測試):

update the_table
  set api_id = t.random_string
from (
 select distinct on (call_id) call_id, random_string() as random_string
 from the_table
 where api_id is null
 order by call_id
) t 
where t.call_id = the_table.call_id
and the_table.api_id is null;

這會在內部查詢中使用每個 call_id 生成一行,並為每個查詢生成一個隨機值。然後使用此結果更新目標表。

上面假設如果已經有一個特定的值,那麼所有call_id都有一個。它不會“填充”其他行缺少的 api_id (例如,如果有一行但沒有)call_id = 123``api_id

引用自:https://dba.stackexchange.com/questions/153174