oracle – 获取许多唯一值,而不分离属于同一块值的值

前端之家收集整理的这篇文章主要介绍了oracle – 获取许多唯一值,而不分离属于同一块值的值前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我可以使用PL / sql解决方案或Access VBA / Excel VBA(虽然Access VBA优于Excel VBA).所以,PL / sql是第一选择,Access VBA是第二选择,Excel VBA是第三选择.

这是一个非常棘手的问题需要解释.请问任何问题,我会尽力回答清楚.

我在名为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,我们就跳过它.你问过这个算法吗?

猜你在找的Oracle相关文章