我有一个表T1,它具有几列,例如10列。我想将数据按5列的值进行分组,比如说param1到param5,然后将group#分配给那些唯一的行。然后,我想在原始表T1上添加一个新列,并将相应的group#添加到每一行。
这是我已采取的步骤:
步骤1-将T1的唯一行保存在表temp2中并分配组号
IF OBJECT_ID('temp2', 'U') IS NOT NULL DROP TABLE temp2
select param1, param2, param3, param4, param5,
ROW_NUMBER() OVER(ORDER BY min(Row#) ASC) AS Group#
into temp2
from T1
group by param1, param2, param3, param4, param5
第2步-使用来自表temp2的附加列组#在temp3中复制原始表
IF OBJECT_ID('temp3', 'U') IS NOT NULL DROP TABLE temp3
select t1.*, t2.Group#
into temp3
from T1 as t1 Left JOIN temp2 as t2
ON (
((t1.param1=t2.param1) OR (ISNULL(t1.param1,t2.param1) IS NULL)) AND
((t1.param2=t2.param2) OR (ISNULL(t1.param2,t2.param2) IS NULL)) AND
((t1.param3=t2.param3) OR (ISNULL(t1.param3,t2.param3) IS NULL)) AND
((t1.param4=t2.param4) OR (ISNULL(t1.param4,t2.param4) IS NULL)) AND
((t1.param5=t2.param5) OR (ISNULL(t1.param5,t2.param5) IS NULL))
)
第3步-将T1替换为temp3
该代码可以正常工作,但是为了改善它,我在脑海中想到以下问题:
Q1-步骤1上的代码是否是将组号分配给唯一行的最佳方法?
Q2-在第2步,当我们要比较多个参数时,是否有矢量化的方法将表2的行与表1匹配?
Q3-在第2步中,如果两个值相同或均为NULL,我想匹配两个值。我的陈述是最好的方法吗?
Q4-我可以跳过步骤3,直接在步骤2中更新原始表吗?
如果有更多方法可以改进此代码,请分享您的想法。