首页 > 解决方案 > 表 Sql-Server 中选定依赖字段的自动增量

问题描述

问题:

是否可以自动完成“帮助”列(自动,无需人工干预)?

if (Login = 'MIPA' AND 'int' in 'Number' is > 7 (大于 7) ) | 健康)状况

然后:

FolderID (varchar) 的最小行

取值1,后面的每一个都是取值i=1,i++(即比前一个大1,即2、3.4等)

   Type    | Name
-----------+-------
varchar(31)| FolderId
varchar(31)| Login 
   int     | Number
   int     | Help


FolderId| Login | Number|  Help
-------+-------+-------+-----
   1   | MIPA  |   1   |  NULL
   4   | MIPA  |   8   |  NULL
   7   | MIPA  |   8   |  NULL
   9   | MIPA  |   3   |  NULL
...
  15   | MIPA  |   8   |  NULL
...
 121   | RODO  |   1   |  NULL
 124   | RODO  |   8   |  NULL
 127   | RODO  |   8   |  NULL
 129   | RODO  |   3   |  NULL
...
1215   | RODO  |   1   |  NULL

所以最后它看起来像这样:

   Type    | Name
-----------+-------
varchar(31)| FolderId
varchar(31)| Login 
   int     | Number
   int     | Help


FolderId| Login | Number|  Help
-------+-------+-------+-----
   1   | MIPA  |   1   |  NULL
   4   | MIPA  |   8   |  1
   7   | MIPA  |   8   |  2
   9   | MIPA  |   3   |  NULL
...
  15   | MIPA  |   8   |  3
...
 121   | RODO  |   1   |  NULL
 124   | RODO  |   8   |  NULL
 127   | RODO  |   8   |  NULL
 129   | RODO  |   3   |  NULL
...
1215   | RODO  |   1   |  NULL

我做了什么?

我从来没有坐在数据库中修改他们的脚本,所以我不知道这样的操作是否可行

我使用管理工作室 2018

标签: sqlsql-serverssms

解决方案


你可以这样计算:

select t.*,
       (case when login = 'MIPA' and Number > 7
             then row_number() over (partition by login, (case when number > 7 then 1 else 0 end)
                                     FolderId
                                    )
        end) as new_help
from t;

如果要更新值,请使用可更新的 CTE:

with toupdate as (
      select t.*,
             row_number() over (partition by login order by FolderId) as new_help
      from t
      where login = 'MIPA' and number > 7
     )
update toupdate
    set help = new_help;

推荐阅读