Skip to content
Advertisement

Renumbering A Column Based On Other Columns

This table contains Purchase Orders which can have multiple lines per order. Right now the table appears like this.

Purchase_OrderNumber Account_Number Line_Number
174558 0000448 1
174558 0000448 2
175812 295812 1
175812 295812 1
175812 295812 2
175812 295812 545
175812 295812 26686
175812 295812 53481
175813 295812 1
175813 295812 2
175813 295812 5

What I need is some SQL statement that will re-number the Line_Number column to based on the Purchase_OrderNumber and Account_Number Columns. So the end result should look like this:

Purchase_OrderNumber Account_Number Line_Number
174558 0000448 1
174558 0000448 2
175812 295812 1
175812 295812 2
175812 295812 3
175812 295812 4
175812 295812 5
175812 295812 6
175813 295812 1
175813 295812 2
175813 295812 3

I do not have much experience with SQL. I could write a Select query to extract the data, write some C# logic to renumber it, and then update the table. However, I would like to see if it could be simplified by handling it all in an SQL statement.

Advertisement

Answer

Use row_number():

select Purchase_OrderNumber, Account_Number,
       row_number() over (partition by Purchase_OrderNumber, Account_Number order by Line_Number) as new_Line_Number
from t;

EDIT:

If you are using SQL Server, you can just use an updatable CTE:

with toupdate as (
      select Purchase_OrderNumber, Account_Number,
             row_number() over (partition by Purchase_OrderNumber, Account_Number order by Line_Number) as new_Line_Number
      from t
     )
update toupdate
    set Line_Number = new_Line_Number
    where Line_Number <> new_Line_Number;
User contributions licensed under: CC BY-SA
8 People found this is helpful
Advertisement