Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何更新唯一标识符不是Int(SQL)的一组帐户_Sql_Sql Server_Sql Server 2012 - Fatal编程技术网

如何更新唯一标识符不是Int(SQL)的一组帐户

如何更新唯一标识符不是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

下面是我的表格,我试图更新的列是planID

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这确实更干净,我想不起我使用版本的场景,我知道我在处理一个运行的总和,但可能从来没有必要。