如何基于上一行增加列的值';SQL中的s值

如何基于上一行增加列的值';SQL中的s值,sql,sql-server-2008,Sql,Sql Server 2008,我正在使用SQLServer2008 我有两个表:User\u master和Item\u master 存在一个用户id为10的用户 |---------| | user_id | |---------| | 10 | |---------| 共有5个项目具有项目id=20到24 |---------|---------|------------| | item_id | user_id | item_order | |---------|---------|-----------

我正在使用SQLServer2008

我有两个表:User\u masterItem\u master

存在一个用户id为10的用户

|---------|
| user_id |
|---------|
|   10    |
|---------|
共有5个项目具有项目id=20到24

|---------|---------|------------|
| item_id | user_id | item_order |
|---------|---------|------------|
|   20    |    10   |     0      |
|---------|---------|------------|
|   21    |    10   |     0      |
|---------|---------|------------|
|   22    |    10   |     0      |
|---------|---------|------------|
|   23    |    10   |     0      |
|---------|---------|------------|
|   24    |    10   |     0      |
|---------|---------|------------|
项目主控中还有一列,即项目顺序(int)。 我想在所有这些行中仅通过一次查询将项的顺序设置为0到4

可能吗

编辑:

项目id不应按顺序排列


例如,从20,21,22,23,24,;它可能是20,25,31,47,58。

稍微外推一下,因为{
项目id
用户id
}在表中是唯一的,所以这里有一个通用解决方案:

UPDATE m
SET item_order = x.new_item_order
FROM item_master m
INNER JOIN (
  SELECT [item_id], [user_id], 
      (ROW_NUMBER() OVER (PARTITION BY [user_id] 
                          ORDER BY [item_id]))-1 AS [new_item_order] 
  FROM item_master
) x ON m.item_id = x.item_id AND m.user_id = x.user_id


这将为每个用户设置
item\u-order
列的
item\u-id
顺序,从0开始。

您可以使用
row\u-number()
窗口函数为具有相同
用户id
的每一行分配一个递增的数字。子查询是必需的,因为不能直接在
set
子句中使用窗口函数

update  im
set     im.item_order = im.rn
from    (
        select  row_number() over (partition by user_id
                                   order by item_id) - 1 as rn
        ,       *
        from    item_master
        ) as im;

我假设您希望按用户分组以生成编号,并且“项目订单”列已经存在,只需要更新

update IM
    set item_order = t.RowNumber
FROM Item_master IM
INNER JOIN
    (select item_id , user_id , ROW_NUMBER() over(PARTITION BY user_id order by item_id ) -1 as 'RowNumber' from Item_master) T
    ON T.item_id = IM.item_id

一个非常简单的解决方案是从项目id中减去20并使用:
update item\u master set item\u order=item\u id-20
。{
item\u id
user\u id
}是否保证是唯一的?@Ic,是的,这些是各个表的主键。@DanielHilgarth,谢谢您的回答,但请查看编辑。@RAS:yes,我想是的。这就是我发表评论而不是回答的原因。然而,它表明了在提出问题时定义约束是多么重要。感谢您的回答,但Andromar的答案要简单得多。@RAS Yes Andromar的答案比这个答案简单一步,因为加入显然是不必要的