Как я могу обновить столбец с непрерывным значением по GROUP? - PullRequest
3 голосов
/ 25 июня 2019

Я собираюсь обновить таблицу с непрерывным значением на основе группы.

   ItemNo       Group
  ---------------------
   null         group1      
   null         group1     
   null         group2      
   null         group2       
   null         group1      
   null         group2     
   null         group1    
   null         group2      
   null         group1      

Это пример таблицы. Я пытаюсь установить поле ItemNo с непрерывным значением по группам. Таким образом, это будет установлено так.

   ItemNo       Group
  ---------------------
   1            group1      
   2            group1     
   1            group2      
   2            group2       
   3            group1      
   3            group2     
   4            group1    
   4            group2      
   5            group1      

Я пытался с помощью этого запроса установить значение без учета группы.

DECLARE @id int
SET @id = 0

UPDATE table
SET @id = ItemNo = @id + 1

Как я могу решить эту проблему?

Спасибо.

Ответы [ 2 ]

4 голосов
/ 25 июня 2019
;with cte as
(
select *,ROW_NUMBER() over (partition by groups order by groups) rn from YOURTABLE
)

update cte set ItemNo=rn

SQLFiddle

1 голос
/ 25 июня 2019

Таблицы SQL представляют неупорядоченные множества. Ваше назначение, кажется, зависит от порядка строк. Для того, чтобы делать то, что вы хотите, вам нужен столбец заказа.

Если он у вас есть, вы можете использовать методы пробелов и островков и обновляемые CTE:

with toupdate as (
      select t.*,
             row_number() over (partition by group, seqnum - seqnum_g order by <ordering col>) as new_itemno
      from (select t.*,
                   row_number() over (order by <ordering col>) as seqnum,
                   row_number() over (partition by group order by <ordering col>) as seqnum_g
            from t
           ) t
     )
update toupdate
    set itemno = new_itemno;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...