3

PostgreSQL テーブルのコマンド行 (サブセレクトから選択) をグループに分割する必要がありUPDATEます。これらのグループは、その列の 1 つの整数値で識別されます。これらのグループは同じサイズである必要があります。ソース テーブルには数十億のレコードが含まれています。

たとえば、選択した 213 行をグループに分割する必要があります。各グループには 50 レコードが含まれている必要があります。結果は次のようになります。

  • 1 - 50。行 => 1
  • 51 - 100. 行 => 2
  • 101 - 150. 行 => 3
  • 151 - 200. 行 => 4
  • 200 - 213. 行 => 5

いくつかのループを使用して (または PostgreSQL ウィンドウ関数を使用して) 問題はありませんが、非常に効率的かつ迅速に実行する必要があります。これらの ID にはギャップがあるはずなので、ID にシーケンスを使用できません。

ランダム整数ジェネレーターを使用して、行のデフォルト値として設定するという考えがあります。しかし、グループサイズを調整する必要がある場合、これは使用できません。

4

2 に答える 2

1
create temporary sequence s minvalue 0 start with 0;

select *, nextval('s') / 50 grp
from t;

drop sequence s;

row_numberバージョン@Richardよりも高速になる可能性があると思います。ただし、詳細によっては、違いが関係ない場合があります。

于 2013-05-03T16:49:32.493 に答える