4

SQLServer2008を使用しています。

User_masterItem_masterの2つのテーブルがあります。

user_id =10のユーザーがいます。

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

item_id = 20〜24のアイテムが5つあります。

|---------|---------|------------|
| 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)というもう1つの列があります。単一のクエリだけで、これらすべての行にitem_order =0から4を配置したいと思います。

出来ますか?

編集 :

item_idは正常ではありません。

たとえば、20,21,22,23,24の代わりに; 20,25,31,47,58になる可能性があります。

4

3 に答える 3

7

ウィンドウ関数を使用row_number()して、同じ を持つ各行に増加する数を割り当てることができますuser_idset句で直接ウィンドウ関数を使用できないため、サブクエリが必要です。

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;

SQL Fiddle での実例。

于 2013-02-07T11:49:44.600 に答える
3

少し外挿し、 { item_id, user_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 フィドルの例

これにより、0 から始まる各ユーザーitem_orderの順序で列が設定されます。item_id

于 2013-02-07T11:48:14.287 に答える
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
于 2013-02-07T11:53:42.993 に答える