情况
在Microsoft SQL Server 2008上,我大约有200万行。 (这本来不会发生,但我们继承了这种情况)。示例如下:
usernum. | phone | email
1 | 123 | [email protected]
2 | 123 | [email protected]
3 | 245 | [email protected]
4 | 678 | [email protected]
目标
我想创建一个看起来像这样的表。这个想法是,如果“电话”或“电子邮件”相同,则会为它们分配相同的组号。
groupnum |usernum. | phone | email
1 | 1 | 123 | [email protected]
1 | 2 | 123 | [email protected]
2 | 3 | 245 | [email protected]
2 | 4 | 678 | [email protected]
到目前为止尝试过
到目前为止,我已经创建了一个简单的python脚本,该脚本在概念上执行以下操作:
-对于表中的每个用户编号
-分配组号
-还将组号分配给电话或电子邮件与此行相同的所有行
-如果已经处理过usernum,请不要分配组号(否则,我们会加倍)
问题
python脚本基本上必须检查每一行是否存在电话或电子邮件重复项。尽管这对于大约10,000条记录来说是完全可以的,但对于200万条记录来说太慢了。我认为这可以在t-sql中完成,这应该比使用pyodbc的python脚本快得多。因此,最大的问题是,如何在sql中执行此操作。
最佳答案
刚刚注意到您说电子邮件或电话重复。为此,我认为您可能需要确定在可以从任一字段加入用户的情况下哪个优先。或者,您也可以将更新分为几批,以根据电话和电子邮件,然后是电子邮件(如果尚未匹配),然后是电话(如果尚未匹配)创建组号,如下所示:
insert into yourGroupsTable (phone, email) -- assuming identity column of groupNum here
select distinct phone, email
from yourUserTable
-- assign group nums with priority on matching phone AND email
update yourUserTable
set groupNum = g.groupNum
from yourUserTable u
join yourGroupsTable g on u.phone = g.phone
and u.email = g.email
现在我想到这将不起作用,因为由于选择不同,每一行都将连接到yourGroupsTable上。我遇到了一种情况,我不确定您的预期结果是什么(对于评论来说太大了)-在这种情况下会发生什么:
您的测试数据略有修改:
groupnum |usernum. | phone | email
1 | 1 | 123 | [email protected]
1 | 2 | 123 | [email protected]
? | 3 | 245 | [email protected]
? | 4 | 678 | [email protected]
? | 5 | 245 | [email protected]
? | 6 | 678 | [email protected]
在上述情况下,组麻木会是什么?