使用特定条件查找具有多个列的唯一值

时间:2013-05-06 15:45:38

标签: sql oracle join

ID?  A  B  C
---  -- -- --
 1   J  1  B
 2   J  1  S
 3   M  1  B
 4   M  1  S
 5   M  2  B
 6   M  2  S
 7   T  1  B
 8   T  2  S
 9   C  1  B
10   C  1  S
11   C  2  B
12   N  1  S
13   N  2  S
14   N  3  S
15   Q  1  S
16   Q  1  S
17   Z  1 B

我需要找到具有多个列且具有一些附加条件的唯一值。唯一值是Col A,B和C的组合。

如果Col A只有两行(如记录1和2),并且B列在两个数据上都相同,并且C列中的值不同,那么我就不需要这些记录了。

如果Col A只有多行(如记录3到6),而且我们希望看到这些值。

如果Col A有多行(如记录7到8),并且有不同的Col B和C组合,我们希望看到这些值。

如果Col A只有多行(如记录9到11),我们希望看到那些值与我们想要看到的那些值。

如果Col A只有多行(如12号记录)和类似的Col C以及类似或不同的B列,我们就不需要这些值......

如果单行值如行17,则无需显示

尝试了很多,但没有得到确切的答案任何帮助都非常感谢..

1 个答案:

答案 0 :(得分:2)

尝试通过所有逻辑,我想你想要列A和B两列的值不同的所有行。查看记录是否不同的简单方法是查看最小值和最大值。而且,您可以使用分析函数来执行此操作:

select A, B, C
from (select t.*,
             count(*) over (partition by A) as Acnt,
             min(B) over (partition by A) as Bmin,
             max(B) over (partition by A) as Bmax,
             min(C) over (partition by A) as Cmin,
             max(C) over (partition by A) as Cmax
      from t
     ) t
where (Bmin <> Bmax or Cmin <> Cmax)

您的示例数据没有任何实际重复项,因此我认为不需要count(distinct)。当A仅出现一次时,您的规则不会说明该怎么做。此版本将过滤掉这些行。