sql - 表 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
解决方案
你可以这样计算:
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;
推荐阅读
- c - 根据 PID 杀死一个进程
- tsql - 指定的文件组“客户”无效
- gnuplot - Gnuplot - 多个“xtic”参数
- php - 似乎没有调用 usort 比较函数
- vba - 将相同的宏应用于所有工作表
- c# - System.ObjectDisposedException:此解析操作已结束
- javascript - 复制没有重复的数据 - Google Apps 脚本
- mysql - SQL:有条件的 SUM
- azure - 创建 Web App Bot 时无法创建新的 Azure 存储
- javascript - 如何在表单提交时通过 jQuery 阻止 Cyrillic unicode