如何根据SQL中先前的Row值增加Column的值

时间:2013-02-07 11:38:21

标签: sql sql-server-2008

我正在使用SQL Server 2008。

我有两个表: User_master Item_master

有一位用户 user_id = 10。

|---------|
| user_id |
|---------|
|   10    |
|---------|

有5个项目 item_id = 20到24。

|---------|---------|------------|
| item_id | user_id | item_order |
|---------|---------|------------|
|   20    |    10   |     0      |
|---------|---------|------------|
|   21    |    10   |     0      |
|---------|---------|------------|
|   22    |    10   |     0      |
|---------|---------|------------|
|   23    |    10   |     0      |
|---------|---------|------------|
|   24    |    10   |     0      |
|---------|---------|------------|

Item_master 中还有一列 item_order(int)。 我想在所有这些行中仅使用单个查询将 item_order = 0设置为4.

有可能吗?

编辑:

item_id不应该是有序的。

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

3 个答案:

答案 0 :(得分:7)

您可以使用row_number()窗口函数为每行使用相同的user_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;

Live example at SQL Fiddle.

答案 1 :(得分:3)

稍微推断一下,由于{item_iduser_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

SQL Fiddle example

这将为每个用户按item_order的顺序设置item_id列,从0开始。

答案 2 :(得分:1)

我假设您希望按用户分组以生成数字,并且item_order列已经存在,只需要更新?

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