这是一个非常棘手的问题需要解释.请问任何问题,我会尽力回答清楚.
我在名为NR_PVO_120的表中有以下数据集.如何在不排除任何传真号码下的任何其他ID的情况下挑选一个UNIQUE OtherID的号码(可以改变,但可以说是6)?
因此,如果从Row7中选择OtherID,则还必须从第8行和第9行中选择OtherID,因为它们具有相同的传真号.基本上,一旦您选择了OtherID,您就有义务选择与您选择的传真号码相同的所有其他ID.
如果请求的数量(本例中为6)不可能,那么“最接近的数字但不超过”将成为规则.
例如,如果从第1-10行中获取OtherID,则将获得6个唯一的OtherID,但第10行与第11行和第12行共享传真.您需要全部使用3(但这会将唯一计数提高到8,这不是不接受)或跳过此OtherID并找到一个传真,它将添加1个唯一的OtherID(例如,它可以有4个OtherID,但结果集中存在3个,因此不会添加到唯一计数).我的6个UNIQUE OtherID的结果将需要包含现有OtherID所连接的任何传真下的所有OtherID.
因此,一种解决方案是采用1-6行,26行.另一种解决方案是采用1-4,10-14行.还有更多,但你明白了.
将有许多可能性(真实数据集有数万行,请求的人数大约为10K),只要连接到结果集上所有传真的所有其他ID都是请求数量的一部分(在这种情况下为6)任何组合都可以.
几点说明.
>要求尽可能接近所要求的号码.
>某些OtherID将有一个空白传真,它们只应作为最后的手段包含在内(对于请求的号码而言,其他ID不够).
这是怎么做到的?
Row OtherID Fax 1 11098554 2063504752 2 56200936 2080906666 3 11098554 7182160901 4 25138850 7182160901 5 56148974 7182232046 6 56530104 7182234134 7 25138850 7182234166 8 56148974 7182234166 9 11098554 7182234166 10 56597717 7182248132 11 56166294 7182248132 12 25138850 7182248132 13 56148974 7182390090 14 56226456 7182390090 15 56148974 7182395285 16 25138850 7182395285 17 56166614 7180930966 18 11098554 7180930966 19 56159509 7180930966 20 25138850 7185462234 21 56148974 7185462234 22 25138850 7185465013 23 56024315 7185465013 24 56115247 7185465281 25 25138850 7185465281 26 56148975 7185466029
一些示例输出
一个解决方案是采用1-6和26行.
Row OtherID Fax 1 11098554 2063504752 2 56200936 2080906666 3 11098554 7182160901 4 25138850 7182160901 5 56148974 7182232046 6 56530104 7182234134 26 56148975 7185466029
另一种解决方案是采用1-4行和10-14行.
Row OtherID Fax 1 11098554 2063504752 2 56200936 2080906666 3 11098554 7182160901 4 25138850 7182160901 10 56597717 7182248132 11 56166294 7182248132 12 25138850 7182248132 13 56148974 7182390090 14 56226456 7182390090
还有更多.
我只需要传真作为输出.
这是一个传真活动,我们需要确保没有传真号码传真两次,所有连接到该传真号码的人都会在一个传真发送的情况下联系.
因此,我们的想法是在您最终使用的任何传真下获取所有其他ID.
编辑这里是如何完成它,也许这有助于画一幅画
列表按传真排序,它们从列表中下载到随机点,确保最后的记录与相同的传真结束.所以在我的例子中,他们会停在第1,2,4,5,6,9,12,14,16,19,21,23,25,26行.然后他们会看到他们在此之前有多少独特的OtherID.如果它太多了,他们上去一些,看看他们有多少.如果它太少,它们会下降一些,看看它们有多少.他们一直这样做,直到他们得到他们唯一的号码.唯一的要求是始终在传真中包含所有其他ID.
您的主要目标是向人们发送信息,并避免一个人收到传真两次的情况.首先,您需要一个唯一收件人列表,如下所示:
select distinct otherid from NR_PVO_120
如果一个人有两个传真号码,您需要决定选择哪一个:
select otherid,fax from (select otherid,fax,row_number() over (partition by otherid order by <choosing rule>) rn from NR_PVO_120) where rn = 1
(所有这些你在前一个问题的答案中都有)
如果您使用此传真号码列表,则所有收件人都会收到传真,每个人只能收到一份传真.但是不会使用某些传真号码.你可以很容易地找到它们:
select otherid,row_number() over (partition by otherid order by <choosing rule>) rn from NR_PVO_120) where rn > 1
如果您将传真发送到任何此号码,则有些人会收到两次传真.
英语不是我的母语,所以当你说“不破坏传真号码”时,我不明白你的意思.正如我在你的问题中所看到的,你可能需要在你的问题中使用传真号码的顺序作为数字优先级(表中的数字越大 – 使用它的概率越高).看起来你可以使用以下内容:
select otherid,row_number() over (partition by otherid order by row) rn from NR_PVO_120) where rn = 1
这里的row by order by子句是你的示例表中的一行.
UPDP. S.关于我的上一个问题:我们有一个具有特定顺序的表,顺序很重要.我们逐行获取表格的行.取第一行并将其otherid和传真放到结果表中.然后采取下一行.如果它包含另一个传真号码和otherid,我们接受它,如果我们的结果表中已经有了otherid,我们就跳过它.你问过这个算法吗?