场合
在Microsoft SQL Server 2008上,我有大约200万行。 (这应该从未发生过,但我们继承了这种情况)。样本如下:
usernum. | phone | email
1 | 123 | user1@local.com
2 | 123 | user2@local.com
3 | 245 | user3@local.com
4 | 678 | user3@local.com
目标
我想创建一个看起来像这样的表。这个想法是,如果'电话'或者'电子邮件'是相同的,他们被分配相同的组号。
groupnum |usernum. | phone | email
1 | 1 | 123 | user1@local.com
1 | 2 | 123 | user2@local.com
2 | 3 | 245 | user3@local.com
2 | 4 | 678 | user3@local.com
目前已尝试
到目前为止,我已经创建了一个简单的python脚本,在概念上执行以下操作:
- 对于表中的每个用户数量
- 分配组号
- 还将组号分配给电话或电子邮件与此行相同的所有行
- 如果usernum已经处理,请不要分配组号(否则我们会做双倍的事情)
的问题
如果手机或电子邮件有重复项,python脚本基本上必须检查每一行。虽然这对于大约10,000条记录来说完全没问题,但对于200万条记录来说这太慢了。我认为这可能在t-sql中做,这应该比使用pyodbc的python脚本快得多。
因此,最大的问题是,如何在sql中执行此操作。
答案 0 :(得分:1)
刚刚注意到您说电子邮件或电话是重复的。为此,我认为您需要确定哪个用户可以从任一字段加入的优先级。或者您可能只是将更新拆分为几个批次以根据电话和电子邮件制作组号,然后发送电子邮件(当尚未匹配时),然后打电话(如果尚未匹配):
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
现在我发现这不起作用,因为每个行都会因为不同的select而加入yourGroupsTable。我遇到了一个场景,我不确定你的预期结果是什么(并且评论太大了) - 在这个例子中会发生什么:
您的测试数据略有修改:
groupnum |usernum. | phone | email
1 | 1 | 123 | user1@local.com
1 | 2 | 123 | user2@local.com
? | 3 | 245 | user3@local.com
? | 4 | 678 | user3@local.com
? | 5 | 245 | user7@local.com
? | 6 | 678 | user7@local.com
在上述情况下,小组会出现什么麻烦?
答案 1 :(得分:0)
正如你所做的那样python脚本是好方法...如果你想用mysql移动使它在插入记录之前一个程序必须检查它是否存在于表中
如果存在 然后获取该行groupnum并将该groupnum分配给此新记录... 如果不 然后给出新的groupnum
但我仍然没有什么困惑
现在如果记录是
5 | 678 | user1@local.com
如果是这样的话呢?
我认为列[电话和电子邮件]都考虑给groupnum。
如果我的假设是正确的,那么请使用mysql程序......