Skip to content
Advertisement

Cheapest way to assign rows in order of sequence

I have a project where I have a list of barcodes, and I need to associate them to record numbers in the correct sequence based on a second column.

My data looks like this:

Coupon Code  |  Code Type | Sequence
1234567890   |     1      |  NULL
9876543210   |     1      |  NULL
5464654222   |     2      |  NULL
4554222558   |     3      |  NULL
5464622154   |     3      |  NULL
5688979465   |     3      |  NULL

And then I have another set of data like this:

Sequence  |   Code Type
    1     |      3
    2     |      3
    3     |      1
    4     |      2
    5     |      1
    6     |      3

Is there any cheap way to join these two data sets such that I can assign the sequence in the first table based on the second? It is really arbitrary which barcode gets assigned first, as long as it is the correct barcode type. I have already done a cursor and it was way too slow.

Any suggestions? I can do my own research, just someone pointing me in the right direction would be a big help. Sorry for poor formatting.

Advertisement

Answer

If I understand correctly you can use row_number():

select t1.*, t2.sequence
from (select t1.*,
             row_number() over (partition by code_type order by couponcode) as seqnum
      from table1 t1
     ) t1 join
     (select t2.*,
             row_number() over (partition by code_type order by sequence) as seqnum
      from table2 t2
     ) t2
     on t1.code_type = t2.code_type and t1.seqnum = t2.seqnum;

This type of logic can be incorporated into an update if you need to assign the value. However, the syntax for that depends on the database you are using.

EDIT:

The update in SQL Server would be:

update t1
    set t1.sequence = t2.sequence
from (select t1.*,
             row_number() over (partition by code_type order by couponcode) as seqnum
      from table1 t1
     ) t1 join
     (select t2.*,
             row_number() over (partition by code_type order by sequence) as seqnum
      from table2 t2
     ) t2
     on t1.code_type = t2.code_type and t1.seqnum = t2.seqnum;
User contributions licensed under: CC BY-SA
1 People found this is helpful
Advertisement