小编典典

如何修剪重复的关联以产生唯一的最完整集合

sql

我几乎不知道如何陈述这个问题,更不用说寻找答案了。但是,这是我最好的镜头。假设我有一张桌子

Col1   Col2
-----+-----
 A   | 1
 A   | 2
 A   | 3
 A   | 4
 B   | 1
 B   | 2
 B   | 3
 C   | 1
 C   | 2
 C   | 3
 D   | 1

我想找到关联(行)的子集,其中:

  1. Col1中没有重复项
  2. Col2中没有重复项
  3. Col1中的每个值都与Col2中的一个值相关联

所以上面的例子可能会产生这个结果

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吗?今天我的大脑不知所措。我希望有人能帮助我找到一个巧妙的简单解决方案。


阅读 169

收藏
2021-05-16

共1个答案

小编典典

在我看来,您的目标是SQL不够强大。这是一项非标准的算法任务,我认为您需要一种真正的编程语言来实现它。您的任务使我想起了国际象棋之谜。

2021-05-16