如何基于上一行增加列的值';SQL中的s值
我正在使用SQLServer2008 我有两个表:User\u master和Item\u master 存在一个用户id为10的用户如何基于上一行增加列的值';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 | |---------|---------|-----------
|---------|
| 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的答案比这个答案简单一步,因为加入显然是不必要的