我几乎不知道如何陈述这个问题,更不用说寻找答案了。但是,这是我最好的镜头。假设我有一张桌子
Col1 Col2 -----+----- A | 1 A | 2 A | 3 A | 4 B | 1 B | 2 B | 3 C | 1 C | 2 C | 3 D | 1
我想找到关联(行)的子集,其中:
所以上面的例子可能会产生这个结果
Col1 Col2 -----+----- A | 4 B | 2 C | 3 D | 1
请注意,结果中必须有A-4,因为有4个唯一字母和4个唯一数字,因此,如果您不将A关联到4,则不会保留子集,该子集不会映射Col1中的每个值,同时又保留了Col1的唯一性。 Col2。
另外,请注意,用B-3和C-2替换B-2和C-3同样有效。我不在乎选择哪个子集,但是我想要一个可以满足所有要求的子集。
并非每个数据集都有一个满足所有要求的子集,但是我想尽可能地接近。
我正在尝试使用SQL查询来做到这一点。我有一个查询似乎可以为一组数据完成此查询,但是随后我不得不为一组稍有不同的数据集(其中Col2实际上是一对列)重写了它,并且无法重现我先前的成功。我的第一个解决方案使用Min()和Group By以及几个Joins对合计结果进行标记,以将重复项标记为循环,直到没有可以安全消除的内容为止。我最近的解决方案用使用PARTITION_BY的ROW_NUMBER()表达式替换了分组依据查询。但是我无法弄清楚在上面的示例中,如何处理多重交叉链接对(例如B和C)中存在多个有效结果集的情况。我之前的查询可能已经处理了,但是我不太理解我所做的事情(写那一个时一定过得很愉快)。也许我需要在子查询中的ROW_NUMBER表达式上进行JOIN吗?今天我的大脑不知所措。我希望有人能帮助我找到一个巧妙的简单解决方案。
在我看来,您的目标是SQL不够强大。这是一项非标准的算法任务,我认为您需要一种真正的编程语言来实现它。您的任务使我想起了国际象棋之谜。