• How about this:

    select * from #tReceive;

    with basedata as (

    select

    rn = row_number() over (partition by JobNumberID, PONUMBER, DELIVNOTE, [DATE] order by ORDERKEY)

    , JobNumberID

    , PONUMBER

    , DELIVNOTE

    , DATE

    , ORDERKEY

    , TYPE

    , Quantity

    from

    #tReceive

    ), rCTE as (

    select

    NEWID() PoReceiveHeaderGuid

    , JobNumberID

    , PONUMBER

    , DELIVNOTE

    , DATE

    , ORDERKEY

    , TYPE

    , Quantity

    , rn

    from

    basedata

    where

    rn = 1

    union all

    select

    r.PoReceiveHeaderGuid

    , bd.JobNumberID

    , bd.PONUMBER

    , bd.DELIVNOTE

    , bd.DATE

    , bd.ORDERKEY

    , bd.TYPE

    , bd.Quantity

    , bd.rn

    from

    rCTE r

    inner join basedata bd

    on (r.JobNumberID = bd.JobNumberID and

    r.PONUMBER = bd.PONUMBER and

    r.DELIVNOTE = bd.DELIVNOTE and

    r.[DATE] = bd.[DATE])

    where

    r.rn = case bd.rn when 1 then 0 else 1 end

    )

    --select

    -- r.PoReceiveHeaderGuid

    -- , r.JobNumberID

    -- , r.PONUMBER

    -- , r.DELIVNOTE

    -- , r.DATE

    -- , r.ORDERKEY

    -- , r.TYPE

    -- , r.Quantity

    --from rCTE r

    --order by

    -- r.JobNumberID

    -- , r.PONUMBER

    -- , r.DELIVNOTE

    -- , r.DATE

    -- , r.ORDERKEY

    update tr set

    PoReceiveHeaderGuid = r.PoReceiveHeaderGuid

    from

    #tReceive tr

    inner join rCTE r

    on (tr.JobNumberID = r.JobNumberID and

    tr.PONUMBER = r.PONUMBER and

    tr.DELIVNOTE = r.DELIVNOTE and

    tr.[DATE] = r.[DATE]);

    select * from #tReceive;