2014-06-10 56 views
0

通过使用行号,我已经分配了一些列。基本上查询如下。row_number从最后一个数字开始?

update product set row_number= CONVERT(nvarchar(255), (ROW_NUMBER() over (partition by product.groupID order by product.groupID))) 

但现在有新产品,他们没有row_number(作为null)。我无法重新分配所有row_numbers。我想继续使用最后一个数字来分配空字符。 我该怎么用tsql来做。

基本上按照下面的样本表。 d应该得到4,G应该得到3和H应为1。

product row_number groupID 
    A   1   1 
    B   2   1 
    C   3   1 
    D  null  1 
    E   1   2 
    F   2   2 
    G  null  2 
    H  null  3 
+0

分区由product.groupID ORDER BY ** ** product.groupID? –

+0

是否有可能在后台重命名此表,让更新表单指向新表名,并将此表名替换为使用ROW_NUMBER()OVER(PARTITION BY product.groupID ORDER BY product.product)的视图作为这row_number列? –

+0

@hamlet:我认为order by by does not影响查询。但是,我认为分组是一种种类。在我对谷歌的研究之后,我看到了这种用法。无论如何,这个锻炼最初适合我。这与我原来的问题 – batmaci

回答

1

创建一个创建行号的CTE,然后更新表与CTE的结果。

;with cte(product, groupId, newRowNumber) 
as(
select product, groupId, ROW_NUMBER() over (partition by product.groupID order by product.groupID, product.product) 
from product 
) 

update product 
set row_number = newRowNumber 
from cte 
where cte.groupId = product.groupId 
and cte.product = product.product 
and product.row_number is null 

SQL Fiddle

+0

无关,谢谢Jerrad,它真的对我有用:) – batmaci

0

尝试这种情况:

与列表作为 **(选择ID,ROW_NUMBER()以上(分区由GROUPID为了通过groupid)从产品中删除) 更新产品 set dbo.product.row_number = CONVERT(nvarchar(255),list.rn) from list inner join dbo.product on list.ID = dbo.product.ID **

相关问题