简体   繁体   中英

Updating column based on another column's value

How do i update table structured like this:

id[pkey] | parent_id  | position
1           1           
2           1
3           1
4           1
5           1

6           2
7           2
8           2
9           2

10          3
11          3
12          3

...and so on

to achieve this result:

id[pkey] | parent_id  | position       
1           1               1
2           1               2
3           1               3
4           1               4
5           1               5

6           2               1
7           2               2
8           2               3
9           2               4

10          3               1
11          3               2
12          3               3

...and so on

I was thinking about somehow mixing

SELECT DISTINCT parent_id FROM cats AS t;

with

CREATE SEQUENCE dpos;
UPDATE cats t1 SET position = nextval('dpos') WHERE t.parent_id = t1.parent_id;
DROP SEQUENCE dpos;

although im not really experienced with postgres, and not sure how to use some kind of FOREACH. I appreciate any help

Use row_number function

select parent_id, 
row_number() over (partition by parent_id order by parent_id) as position_id from table

You can get the incremental number using row_number() . The question is how to assign it to a particular row. Here is one method using a join :

update cats
    set position = c2.newpos
    from (select c2.*, c2.ctid as c_ctid,
                 row_number() over (partition by c2.parent_id order by NULL) as seqnum
          from cats c2
         ) c2
    where cats.parent_id = c2.parent_id and cats.ctid = c2.c_ctid;

Try this:

    UPDATE table_name set table_name.dataID = v_table_name.rn
FROM  
(
    SELECT row_number() over (partition by your_primaryKey order by your_primaryKey) AS rn, id
    FROM table_name
) AS v_table_name
WHERE v_table_name.your_primaryKey = v_table_name.your_primaryKey;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM