0

次のコードは機能し、新しい名前ごとに再開されるシーケンス番号を持つ一時テーブルを作成します。

with results as (select row_number() over (partition by name order BY name) as mytid,name from telephn_table)
select * from results order by name

ただし、私の目的は、新しいシーケンス番号を電話テーブルに永続的に挿入することです。新しいシーケンス番号を結果テーブルから電話テーブルに転送するにはどうすればよいですか? MySql について次のような問題に遭遇しましたが、Postgresql に変換できませんでした。

MySQL: 別のフィールドに基づいてシーケンス列を追加します

誰でも助けることができますか?

4

2 に答える 2

3

メモリが機能する場合、row_number()それ自体のパーティション内の数値を返します。つまり、row_number() over (partition by name order BY name)重複を除く各行に対して 1 を返します。代わりに必要になる可能性がありrank() over (order by name)ます。


長い議論の後:

update telephn_table
set sid = rows.new_sid
from (select pkey,
             row_number() over (partition BY name) as new_sid,
             name
      from telephn_table
      ) as rows
where rows.pkey = telephn_table.pkey;
于 2011-05-18T01:42:38.500 に答える
0

これは機能します!(以前のMySqlリンクへの私のOPリンクを参照してください。Postgresqlでは、一時テーブルを必要とせずに機能します)

テーブル telephn_table を変更し、カラム tid 整数のデフォルトを 0 に追加します。UPDATE telephn_table set tid=(t.sid < telephn_table.sid および telephn_table.name=t.name である telephn_table t からカウント (*)+1 を選択)

于 2011-05-18T21:53:20.480 に答える