在规范化 table 中更新行
Updating Rows in a normalized table
规范化table
ID SEQ Type Value Flag
1 1 a 100 -
1 2 a 200 -
1 3 a 250 -
1 4 b 200 -
2 1 a 150 -
2 2 b 100 -
2 3 b 200 -
如何编写单个更新语句,使生成的 table 填充如下
ID SEQ Type Value Flag
1 1 a 100 valid
1 2 a 200 repeat
1 3 a 250 repeat
1 4 b 200 valid
2 1 a 150 valid
2 2 b 100 valid
2 3 b 200 repeat
编辑:包含 seq 列
只有第一次出现的 ID 组类型值才应具有有效标志
它应该写成两个单独的更新语句吗?
有人可以澄清我吗?
非常感谢
首先使用 row_number()
填充 table,然后更新 table。
选项 1:
select
Id,
Type,
Value,
null as Flag,
row_number() over (partition by ID, Type order by SEQ) as rnk
from yourTable
那么你可以使用 update
update yourTable
set flag = case
when rnk = 1 then 'valid'
else 'repeat'
end
选项 2:
您可以不使用 update
语句,如下所示
select
Id,
SEQ,
Type,
Value,
case
when rnk = 1 then 'valid'
else 'repeat'
end as flag
from
(
select
Id,
SEQ,
Type,
Value,
row_number() over (partition by ID, Type order by SEQ) as rnk
from yourTable
) val
规范化table
ID SEQ Type Value Flag
1 1 a 100 -
1 2 a 200 -
1 3 a 250 -
1 4 b 200 -
2 1 a 150 -
2 2 b 100 -
2 3 b 200 -
如何编写单个更新语句,使生成的 table 填充如下
ID SEQ Type Value Flag
1 1 a 100 valid
1 2 a 200 repeat
1 3 a 250 repeat
1 4 b 200 valid
2 1 a 150 valid
2 2 b 100 valid
2 3 b 200 repeat
编辑:包含 seq 列
只有第一次出现的 ID 组类型值才应具有有效标志 它应该写成两个单独的更新语句吗? 有人可以澄清我吗? 非常感谢
首先使用 row_number()
填充 table,然后更新 table。
选项 1:
select
Id,
Type,
Value,
null as Flag,
row_number() over (partition by ID, Type order by SEQ) as rnk
from yourTable
那么你可以使用 update
update yourTable
set flag = case
when rnk = 1 then 'valid'
else 'repeat'
end
选项 2:
您可以不使用 update
语句,如下所示
select
Id,
SEQ,
Type,
Value,
case
when rnk = 1 then 'valid'
else 'repeat'
end as flag
from
(
select
Id,
SEQ,
Type,
Value,
row_number() over (partition by ID, Type order by SEQ) as rnk
from yourTable
) val