如何更新唯一标识符不是Int(SQL)的一组帐户
下面是我的表格,我试图更新的列是planID如何更新唯一标识符不是Int(SQL)的一组帐户,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,下面是我的表格,我试图更新的列是planID AccountUsageID AccountID PLanID 38dkaie 1234 1 38d246e 1234 1 38dka41 1234 1 38dA38e 1234 1 3AKkaie 1234 1
AccountUsageID AccountID PLanID
38dkaie 1234 1
38d246e 1234 1
38dka41 1234 1
38dA38e 1234 1
3AKkaie 1234 1
3854E6e 1234 1
AEdka41 1234 1
IRKMdAe 1234 1
总共有8个帐户,我想将planID更新为1,2,3,每个计划有2个帐户
最终结果应该如下所示:
AccountUsageID AccountID PLanID
38dkaie 1234 1
38d246e 1234 1
38dka41 1234 2
38dA38e 1234 2
3AKkaie 1234 3
3854E6e 1234 3
AEdka41 1234 4
IRKMdAe 1234 4
有人能帮忙吗?您可以使用
行数()
函数和一些模数除法:
;with cte AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY AccountID ORDER BY [Account Usage]) RN
FROM TAble1
)
UPDATE cte
SET PlanID = (RN-(RN-1)%2)/2+1
演示:
这将确保
PLANID
和ACCOUNTID
的每个组合不超过2条记录。如果您不想对不同的AccountID
值重复PLANID
,您可以删除按AccountID划分的分区,同样,您可以根据[帐户使用情况]
更改顺序以满足您的偏好
ROW\u NUMBER()
函数为每行分配一个数字。按
分区是可选的,但用于重新开始该组中每个值的编号,即:如果您按某个日期进行分区
,则对于每个唯一的日期值,编号将从1开始ORDER BY
当然用于定义计数方式,并且在ROW_NUMBER()
函数中是必需的
更新:您可以通过简单地更改模数和除法步骤中使用的整数来调整每套项目的数量,并且您可以在执行更新之前先选择它来测试结果:
;with cte AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY AccountID ORDER BY [Account Usage]) RN
FROM TAble1
)
SELECT [Account Usage],AccountID, PlanID = (RN-(RN-1)%30)/30+1
FROM cte
是否要更新表中的
PlanId
列,还是仅使用PlanId
生成查询?您使用的是什么数据库?我想更新表中的值。我使用的是SQL 2012哪个帐户使用值的PlanID是任意的?我输入错了,它应该是AccountUsageID,这是这个表的唯一ID,它与PlanID没有关联。非常感谢Goat Co!如果我有120个帐户,我想把它分成4个计划(30个帐户=planID 6,30个帐户=planID 10…等等),你能帮我吗?如果你不想把分区按AccountID
部分分解成planID
中的记录,您只需更新更新查询中使用的数字,即可选择每个planID的帐户数,即30=(RN-(RN-1)%30)/30+1
。完美!非常感谢你的帮助!为什么你要用这个表达式而不是1+((RN-1)/30)
?@GordonLinoff这确实更干净,我想不起我使用版本的场景,我知道我在处理一个运行的总和,但可能从来没有必要。