为多列的唯一组合分配组号

时间:2018-09-24 18:33:55

标签: sql-server grouping vectorization

我有一个表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中更新原始表吗?

如果有更多方法可以改进此代码,请分享您的想法。

0 个答案:

没有答案