![]() | |
![]() |
| | Thread Tools | Display Modes |
#1
| |||
| |||
|
#2
| |||
| |||
|
|
I have some rows that I would like to renumber. *For example: * * select * from t where name like 'x%' order by seq; * * seq * *name * * --- * *---- * * *15 * *xfoo * * *17 * *xbar * * *26 * *xbaz desired state, seq column renumbered starting at 1: * * seq * *name * * --- * *---- * * * 1 * *xfoo * * * 2 * *xbar * * * 3 * *xbaz Is there a single sql statement that can do this? *Or should I just loop over the result set and manually update the seq for each row? Many TIA! Mark -- Mark Harrison Pixar Animation Studios |
#3
| |||
| |||
|
|
On Jan 14, 2:02*pm, m... (AT) pixar (DOT) com wrote: I have some rows that I would like to renumber. *For example: * * select * from t where name like 'x%' order by seq; * * seq * *name * * --- * *---- * * *15 * *xfoo * * *17 * *xbar * * *26 * *xbaz desired state, seq column renumbered starting at 1: * * seq * *name * * --- * *---- * * * 1 * *xfoo * * * 2 * *xbar * * * 3 * *xbaz Is there a single sql statement that can do this? *Or should I just loop over the result set and manually update the seq for each row? Many TIA! Mark -- Mark Harrison Pixar Animation Studios This might get you started: SQL> create table renum( * 2 * * * * *seq * * number, * 3 * * * * *name * *varchar2(10) * 4 *); Table created. SQL SQL> insert all * 2 *into renum * 3 *values(15,'xfoo') * 4 *into renum * 5 *values(17, 'xbar') * 6 *into renum * 7 *values(26, 'xbaz') * 8 *select * From dual; 3 rows created. SQL SQL> commit; Commit complete. SQL SQL> select seq, name, rank() over (order by seq) rk * 2 *from renum; * * * *SEQ NAME * * * * * * * RK ---------- ---------- ---------- * * * * 15 xfoo * * * * * * * *1 * * * * 17 xbar * * * * * * * *2 * * * * 26 xbaz * * * * * * * *3 SQL SQL> update renum * 2 *set seq = (select num.rk from * 3 * * * * * * * * *(select seq, rank() over (order by seq) rk * 4 * * * * * * * * * * * * *from renum) num * 5 * * * * * * * * *where num.seq = renum.seq) * 6 */ 3 rows updated. SQL SQL> select * * 2 *from renum; * * * *SEQ NAME ---------- ---------- * * * * *1 xfoo * * * * *2 xbar * * * * *3 xbaz SQL You may need to modify the code for your actual data, but it, hopefully, gives you a push in the right direction. David Fitzjarrell- Hide quoted text - - Show quoted text - |
#4
| |||
| |||
|
|
I have some rows that I would like to renumber. *For example: * * select * from t where name like 'x%' order by seq; * * seq * *name * * --- * *---- * * *15 * *xfoo * * *17 * *xbar * * *26 * *xbaz desired state, seq column renumbered starting at 1: * * seq * *name * * --- * *---- * * * 1 * *xfoo * * * 2 * *xbar * * * 3 * *xbaz Is there a single sql statement that can do this? *Or should I just loop over the result set and manually update the seq for each row? Many TIA! Mark -- Mark Harrison Pixar Animation Studios |
#5
| |||
| |||
|
|
On Jan 14, 4:00*pm, ddf <orat... (AT) msn (DOT) com> wrote: You may need to modify the code for your actual data, but it, hopefully, gives you a push in the right direction. |
|
Mark, David's plan is fine providing the sequence is not a PK or UK referenced by a FK constraint, but why do you need to re-number the sequence column? If the sequence field is a key then generated key values are arbitrary in nature and gaps should not matter. The reason I am asking has more to do with how the value will be handled going forward rather than the 'fix' being made. |
#6
| |||
| |||
|
|
Mark D Powell <Mark.Pow... (AT) eds (DOT) com> wrote: On Jan 14, 4:00*pm, ddf <orat... (AT) msn (DOT) com> wrote: You may need to modify the code for your actual data, but it, hopefully, gives you a push in the right direction. Thanks David, just what I needed! Mark, David's plan is fine providing the sequence is not a PK or UK referenced by a FK constraint, but why do you need to re-number the sequence column? *If the sequence field is a key then generated key values are arbitrary in nature and gaps should not matter. *The reason I am asking has more to do with how the value will be handled going forward rather than the 'fix' being made. Ah, I should have explained that part. *It's part of our film processing system, the seq is actually a queue position. So it's an easy way to bump an emergency job to the front of the queue. It's a PK, but processed items are deleted from the system so there's always a gap at the front.. Thanks! Mark -- Mark Harrison Pixar Animation Studios |
#7
| |||
| |||
|
|
On Jan 15, 6:39 pm, m... (AT) pixar (DOT) com wrote: Mark D Powell <Mark.Pow... (AT) eds (DOT) com> wrote: On Jan 14, 4:00 pm, ddf <orat... (AT) msn (DOT) com> wrote: You may need to modify the code for your actual data, but it, hopefully, gives you a push in the right direction. Thanks David, just what I needed! Mark, David's plan is fine providing the sequence is not a PK or UK referenced by a FK constraint, but why do you need to re-number the sequence column? If the sequence field is a key then generated key values are arbitrary in nature and gaps should not matter. The reason I am asking has more to do with how the value will be handled going forward rather than the 'fix' being made. Ah, I should have explained that part. It's part of our film processing system, the seq is actually a queue position. So it's an easy way to bump an emergency job to the front of the queue. It's a PK, but processed items are deleted from the system so there's always a gap at the front.. Ok, but 15, 17, 26 became 1, 2, 3 so the relative order remained the same. If the queue logic processes in key order what is the real need to re-value the key? If you just want to show the relative queue position 1..n then you can do that in the query results via row_number or perhaps even using rownum of an ordered select, that is, select film, rownum as QueuePosition from (select film from table order by key) |
|
If you need to change the processing order you could have the sequence increment by 2 so that holes exist to move lower ranked items into when you want to advance a lower ranked item. |
|
Obviously there may be more to the process that your initial post and minor followup explain so I just want to make sure you have considered your options and are no doing unnecessary work. |
#8
| |||
| |||
|
|
On 16.01.2009 18:52, Mark D Powell wrote: On Jan 15, 6:39 pm, m... (AT) pixar (DOT) com wrote: Mark D Powell <Mark.Pow... (AT) eds (DOT) com> wrote: On Jan 14, 4:00 pm, ddf <orat... (AT) msn (DOT) com> wrote: You may need to modify the code for your actual data, but it, hopefully, gives you a push in the right direction. Thanks David, just what I needed! Mark, David's plan is fine providing the sequence is not a PK or UK referenced by a FK constraint, but why do you need to re-number the sequence column? *If the sequence field is a key then generated key values are arbitrary in nature and gaps should not matter. *The reason I am asking has more to do with how the value will be handled going forward rather than the 'fix' being made. Ah, I should have explained that part. *It's part of our film processing system, the seq is actually a queue position. So it's an easy way to bump an emergency job to the front of the queue. It's a PK, but processed items are deleted from the system so there's always a gap at the front.. Ok, but 15, 17, 26 became 1, 2, 3 so the relative order remained the same. *If the queue logic processes in key order what is the real need to re-value the key? *If you just want to show the relative queue position 1..n then you can do that in the query results via row_number or perhaps even using rownum of an ordered select, that is, select film, rownum as QueuePosition from (select film from table order by key) Just guessing: maybe he is afraid of running out of sequence numbers or wants to limit the sequence numbers because the fields has a small size limit like NUMBER(4). |
#9
| |||
| |||
|
|
On Jan 17, 2:15 am, Robert Klemme <shortcut... (AT) googlemail (DOT) com> wrote: On 16.01.2009 18:52, Mark D Powell wrote: On Jan 15, 6:39 pm, m... (AT) pixar (DOT) com wrote: Mark D Powell <Mark.Pow... (AT) eds (DOT) com> wrote: On Jan 14, 4:00 pm, ddf <orat... (AT) msn (DOT) com> wrote: You may need to modify the code for your actual data, but it, hopefully, gives you a push in the right direction. Thanks David, just what I needed! Mark, David's plan is fine providing the sequence is not a PK or UK referenced by a FK constraint, but why do you need to re-number the sequence column? If the sequence field is a key then generated key values are arbitrary in nature and gaps should not matter. The reason I am asking has more to do with how the value will be handled going forward rather than the 'fix' being made. Ah, I should have explained that part. It's part of our film processing system, the seq is actually a queue position. So it's an easy way to bump an emergency job to the front of the queue. It's a PK, but processed items are deleted from the system so there's always a gap at the front.. Ok, but 15, 17, 26 became 1, 2, 3 so the relative order remained the same. If the queue logic processes in key order what is the real need to re-value the key? If you just want to show the relative queue position 1..n then you can do that in the query results via row_number or perhaps even using rownum of an ordered select, that is, select film, rownum as QueuePosition from (select film from table order by key) Just guessing: maybe he is afraid of running out of sequence numbers or wants to limit the sequence numbers because the fields has a small size limit like NUMBER(4). My guess is that it is to be human-readable - someone is going to be looking at a list and saying "this one needs to go to the front." What would you think of a top-ten list that had gaps in the numbers? |
![]() |
| Thread Tools | |
| Display Modes | |
| |