T-SQL - 根据 ID 标记一列中的公共值并更新数据库
T-SQL - Flagging Common Values in One Column Based on ID and updating the database
问题陈述:
有两列,VariableName 和 ID。我想用双字符字母代码映射同一列中的变量,例如 'aa'、'ab'、'ac'、'ad'... 最多 'zz' 在 T-SQL.
说明,
输入数据:
VariableName ID MapFlag isMapped
var_1 1 NULL FALSE
var_2 1 NULL FALSE
var_3 1 NULL FALSE
var_4 1 NULL FALSE
var_5 1 NULL FALSE
var_1 2 NULL FALSE
var_2 2 NULL FALSE
var_3 2 NULL FALSE
var_10 2 NULL FALSE
var_11 2 NULL FALSE
var_1 3 NULL FALSE
var_10 3 NULL FALSE
var_3 3 NULL FALSE
var_7 3 NULL FALSE
var_1 4 NULL FALSE
var_2 4 NULL FALSE
var_4 4 NULL FALSE
期望输出
VariableName ID MapFlag isMapped
var_1 1 aa TRUE
var_2 1 ab TRUE
var_3 1 ac TRUE
var_4 1 ad TRUE
var_5 1 NULL FALSE
var_1 2 aa TRUE
var_2 2 ab TRUE
var_3 2 ac TRUE
var_10 2 ae TRUE
var_11 2 NULL FALSE
var_1 3 aa TRUE
var_10 3 ae TRUE
var_3 3 ac TRUE
var_7 3 NULL FALSE
var_1 4 aa TRUE
var_2 4 ab TRUE
var_4 4 ad TRUE
如你所见,
- "var_1" 出现在 id 1、2、3、4 中,并被标记为 'aa'
- "var_2" 出现在 ID 1、2 和 4 中,并标记为 'ab'
- "var_3" 出现在 ID 1、2 和 3 中,并标记为 'ac'
- "var_4" 出现在 id 1 和 4 中,并标记为 'ad'
- "var_5" ,存在于 id 1 但不存在于其余的
IDs,因此为 NULL
- "var_7" ,出现在 id 3 但不出现在其余的
IDs,因此为 NULL
- "var_10" 出现在 id 2 和 3 中,标记为 'ae'
- "var_11" ,存在于 id 2 但不存在于其余的
IDs,因此为 NULL
总结一下:本质上,我想用上面的模式创建一个映射标志 'aa'、'ab'、'ac'
在不同的ID之间。如果 mapFlag 不为 NULL,则 isMapped 为 TRUE,否则为 FALSE
最后,我想编写一个“更新”存储过程,用输入数据转换输入“MapFlag”列,然后用输出数据更新table
这是获取 var 标记的查询。
select VariableName, char(ASCII('a')+rn/(ASCII('z') - ASCII('a') +1)) + char(ASCII('a') -1 + rn%(ASCII('z') - ASCII('a') +1)) y
from (
select VariableName, row_number() over (order by VariableName) rn
from mytable
group by VariableName
having count(distinct id) > 1
) t
问题陈述: 有两列,VariableName 和 ID。我想用双字符字母代码映射同一列中的变量,例如 'aa'、'ab'、'ac'、'ad'... 最多 'zz' 在 T-SQL.
说明,
输入数据:
VariableName ID MapFlag isMapped
var_1 1 NULL FALSE
var_2 1 NULL FALSE
var_3 1 NULL FALSE
var_4 1 NULL FALSE
var_5 1 NULL FALSE
var_1 2 NULL FALSE
var_2 2 NULL FALSE
var_3 2 NULL FALSE
var_10 2 NULL FALSE
var_11 2 NULL FALSE
var_1 3 NULL FALSE
var_10 3 NULL FALSE
var_3 3 NULL FALSE
var_7 3 NULL FALSE
var_1 4 NULL FALSE
var_2 4 NULL FALSE
var_4 4 NULL FALSE
期望输出
VariableName ID MapFlag isMapped
var_1 1 aa TRUE
var_2 1 ab TRUE
var_3 1 ac TRUE
var_4 1 ad TRUE
var_5 1 NULL FALSE
var_1 2 aa TRUE
var_2 2 ab TRUE
var_3 2 ac TRUE
var_10 2 ae TRUE
var_11 2 NULL FALSE
var_1 3 aa TRUE
var_10 3 ae TRUE
var_3 3 ac TRUE
var_7 3 NULL FALSE
var_1 4 aa TRUE
var_2 4 ab TRUE
var_4 4 ad TRUE
如你所见,
- "var_1" 出现在 id 1、2、3、4 中,并被标记为 'aa'
- "var_2" 出现在 ID 1、2 和 4 中,并标记为 'ab'
- "var_3" 出现在 ID 1、2 和 3 中,并标记为 'ac'
- "var_4" 出现在 id 1 和 4 中,并标记为 'ad'
- "var_5" ,存在于 id 1 但不存在于其余的 IDs,因此为 NULL
- "var_7" ,出现在 id 3 但不出现在其余的 IDs,因此为 NULL
- "var_10" 出现在 id 2 和 3 中,标记为 'ae'
- "var_11" ,存在于 id 2 但不存在于其余的 IDs,因此为 NULL
总结一下:本质上,我想用上面的模式创建一个映射标志 'aa'、'ab'、'ac' 在不同的ID之间。如果 mapFlag 不为 NULL,则 isMapped 为 TRUE,否则为 FALSE
最后,我想编写一个“更新”存储过程,用输入数据转换输入“MapFlag”列,然后用输出数据更新table
这是获取 var 标记的查询。
select VariableName, char(ASCII('a')+rn/(ASCII('z') - ASCII('a') +1)) + char(ASCII('a') -1 + rn%(ASCII('z') - ASCII('a') +1)) y
from (
select VariableName, row_number() over (order by VariableName) rn
from mytable
group by VariableName
having count(distinct id) > 1
) t