2013-10-28 6 views
1

У меня есть этот набор данных в wrntybank_table:Обновление таблицы с номером строки, используя row_number() с помощью SQL

doc_no doc_lineno stk_code stk_lineno serial_no warranty_no 
doc1  NULL  ABC   NULL  ABC1  WRN1 
doc1  NULL  ABC   NULL  ABC5  WRN5 
doc1  NULL  DEF   NULL  ABC2  WRN2 
doc2  NULL  ABC   NULL  ABC3  WRN3 
doc4  NULL  HJI   NULL  ABC4  WRN4 
doc4  NULL  HJI   NULL  ABC6  WRN6 

Я хочу, чтобы обновить эту таблицу и заполнен doc_lineno колонки & stk_lineno с номером, чтобы быть, как показано ниже :

doc_no doc_lineno stk_code stk_lineno serial_no warranty_no 
doc1  1  ABC   1  ABC1   WRN1 
doc1  1  ABC   2  ABC5   WRN5 
doc1  2  DEF   1  ABC2   WRN2 
doc2  1  ABC   1  ABC3   WRN3 
doc4  1  HJI   1  ABC4   WRN4 
doc4  1  HJI   2  ABC6   WRN6 

Как это сделать, используя этот код для обоих столбцов.

with toupdate as (
      select Document, 
       10 * row_number() over (partition by Document order by (select NULL)) as val 
      from t 
     ) 
update toupdate 
    set line_num = val; 

примечание: doc_lineno, номер остается одинаковым для одной stk_code в том же doc_no и сбросит на stk_code и doc_no. для stk_lineno, номер сбрасывается при разности. stk_code

ответ

2

Предполагая, что таблица имеет идентификатор col для идентификации каждой строки.

with cte (id, dln, sln) 
as 
(
    select id, dense_rank() over (partition by doc_no order by stk_code asc) as dln 
     , row_number() over (partition by doc_no, stk_code order by serial_no asc) as sln 
    from @t_test 
) 
update @t_test 
set doc_lineno = cte.dln 
    , stk_lineno = cte.sln 
from @t_test as t 
inner join cte as cte 
on t.id = cte.id 
; 
+0

tq очень подходит для ответа. – user2412351

+0

Я получил вдохновение для подобной проблемы. Большое спасибо за такой ответ! –

Смежные вопросы