将序列号设置为行组的列

时间:2018-01-30 10:16:43

标签: sql oracle

我的桌子看起来像这样:

*  user_id   index
1   1      (null)
2   2      (null)
3   2      (null)
4   2      (null)
5   3      (null)
6   3      (null)

我需要设置索引列,以便每个用户都有序列号:

*  user_id   index
1   1      1
2   2      1
3   2      2
4   2      3
5   3      1
6   3      2

我试过这样的事情

create sequence my_seq;
UPDATE my_table SET index=my_seq.nextval WHERE USER_ID=3;

但显然我不能为每个ID执行此操作。有没有办法为所有记录执行此操作?

感谢。

1 个答案:

答案 0 :(得分:4)

您可以将MERGE语句与ROW_NUMBER分析函数一起使用:

MERGE INTO my_table dst
USING (
  SELECT ROWID rid,
         ROW_NUMBER() OVER ( PARTITION BY user_id
                             ORDER BY /*Your order condition*/ ROWNUM ) AS rn
  FROM   my_table
) src
ON ( dst.ROWID = src.rid )
WHEN MATCHED THEN
  UPDATE SET "index" = src.rn WHERE "index" IS NULL;