oracle 需要使用row_number()更新列ID

f4t66c6m  于 2023-08-03  发布在  Oracle
关注(0)|答案(1)|浏览(151)

我有一个包含user_iduser_namerec列的表。我有另一列作为ID。我想填充ID如下。
| 用户名|接收ID| rec ID |
| --|--| ------------ |
| ABC|记录1| rec 1 |
| ABC| rec11| rec1 1 |
| BCD| Rec2 2| rec2 2 |
| BCD| Rec3 2| rec3 2 |
| XYZ| rec11| rec1 1 |
我不确定这是否可能,首先它需要找到唯一的user_id和它的出现次数,然后根据出现次数将1分配给n,但对于user_id,如果有多个记录具有相同的user_name,则两行都应该使用相同的id更新。
以前,这是通过使用user_id作为分区的row_number()实现的,其中id将基于user_id的出现给予1到n。(感谢@MTO)

UPDATE table dst
SET id = (
           SELECT seq
           FROM   (
             SELECT row_number() over (partition by user_id order by user_id) as seq 
             FROM   test_csv
           ) src
           WHERE src.ROWID = dst.ROWID  
         );

字符串

sz81bmfz

sz81bmfz1#

使用DENSE_RANK而不是ROW_NUMBER

UPDATE test_csv dst
SET id = ( SELECT seq
           FROM   (
             SELECT dense_rank() over (partition by user_id order by user_name)
                    as seq
             FROM   test_csv
           ) src
           WHERE src.ROWID = dst.ROWID
         );

字符串
或者,使用MERGE

MERGE INTO test_csv dst
USING (
  SELECT dense_rank() over (partition by user_id order by user_name)
         as seq
  FROM   test_csv
) src
ON (src.ROWID = dst.ROWID)
WHEN MATCHED THEN
  UPDATE
  SET id = src.seq;


其中,对于样本数据:

CREATE TABLE test_csv (user_id, user_name, rec, id) AS
SELECT 123, 'ABC', 'rec', CAST(NULL AS NUMBER) FROM DUAL UNION ALL
SELECT 123, 'ABC', 'rec1', NULL FROM DUAL UNION ALL
SELECT 123, 'BCD', 'rec2', NULL FROM DUAL UNION ALL
SELECT 123, 'BCD', 'rec3', NULL FROM DUAL UNION ALL
SELECT 134, 'XYZ', 'rec1', NULL FROM DUAL;


然后在UPDATEMERGE之后,该表包含:
| 用户名|REC|识别码| ID |
| --|--|--| ------------ |
| ABC|雷克|一个| 1 |
| ABC| rec1|一个| 1 |
| BCD| rec2|二个| 2 |
| BCD| rec3|二个| 2 |
| XYZ| rec1|一个| 1 |
fiddle

相关问题