对不起,因为这个问题很难。
我试图找到一个查询来对两组之间的元素进行配对。
如果允许所有组合,答案很简单,我们可以在以下示例中看到: 考虑2套" In"和" Out"。在" In"中,有" A"和" B",以及" Out" " C"和" D"。
以下是所有可能的组合
In Out
== ==
A C
A D
B C
B D
配对元素的解决方案是按每个元素计算Row_Number分区,并考虑row_number相等的行。
In Out Row_numb part. by In Row_numb part. by Out
== == ==================== =====================
A C 1 1
A D 2 1
B C 1 2
B D 2 2
所以具有相等row_number:(A-C)AND(B-D)配对的解决方案是好的。
现在,我只在允许某些组合时寻找解决方案。考虑这个例子:
In Out
== ==
A C
B C
B D
有两种配对解决方案:{(A-C),(B-D)}和{(B-C)}
我的问题是找到一个查询来检索这个解决方案,理想情况下是最大化同伴数量的解决方案:这里{(A-C),(B-D)}。
我尝试过递归CTE而没有成功
===编辑1:回答@Tanner
这是我使用的查询。
select I, O
from (
select I, O,
n_i = row_number() over (partition by I order by O),
n_o = row_number() over (partition by O order by I)
from MyTab ) as SubQ
where n_i = n_o
当我在第一个选项卡上用4行播放此查询时,结果集为:
I O
---------- ----------
A C
B D
但在有3行的第二个标签上,我想念B-D对:
I O
---------- ----------
A C