在分区上查找重复项并根据条件SQL

时间:2018-12-05 16:58:56

标签: sql db2

我希望所有人都过得不错。我有一个困境,我无法弄清楚。 我试图为不重复的字段找到唯一的值。

例如:

表1

|Col1  | Col2| Col3 |     
| 123  |  A  |  1   |     
| 123  |  A  |  2   |     
|  12  |  B  |  1   |     
|  12  |  B  |  2   |     
|  12  |  C  |  3   |     
|  12  |  D  |  4   |     
|  1   |  A  |  1   |     
|  2   |  D  |  1   |      
|  3   |  D  |  1   |  

Col 1是具有重复值的字段。 Col2将是Col 1中值的所有者。Col 3使用行number()Over Partition语法获取升序的数字。

我要实现的目标是,如果在col2中不是真正唯一的值,请删除col 1中的值。

示例:

Col1的值为123,Col2的值为A。尽管A拥有123的两个实例,但我可以确定它确实是唯一的。

现在看Col1的值为12,B2,C,D的Col2中的值为。

值12与三个不同的所有者相关联,因此从结果列表中删除了12。

所以最后我想看到一个这样的结果表:

|Col1  | Col2| 
| 123  |  A  | 
|  1   |  A  |
|  2   |  D  | 
|  3   |  D  |

总而言之,我想首先使用分区号来识别col1中的值是否重复。从那里,我想验证第2列中的值是否相同。如果是这样,col 1和col 2中的值将保留为一个单独的条目。但是,如果col 2中的值不匹配,则会删除col1值的所有记录。

如果需要,我将提供查询的语法代码。

更新**

我没有提到表1是内部联接两个表的结果。

因此,Col1来自表a,Col2来自表b。

表2中col2的值很难解释,因此我不得不理解它们并为其分配适当的名称值。

我用来合并两者的联接查询是:

Select a.Col1, B.Col2 FROM Table a INNER JOIN Table b on a.Colx = b.Colx

更新**

表a:

|Col1  | Colx| Col3 |     
| 123  | SMS |  1   |     
| 123  | S9W |  2   |     
|  12  | NAV |  1   |     
|  12  | NFR |  2   |     
|  12  | ABC |  3   |     
|  12  | DEF |  4   |     
|  1   | SMS |  1   |     
|  2   | DEF |  1   |      
|  3   | DES |  1   |  

表b:

|Colx  | Col2| 
| SMS  |  A  | 
| S9W  |  A  |
| DEF  |  D  | 
| DES  |  D  |
| NAV  |  B  |
| NFR  |  B  |
| ABC  |  C  |

上面是两个表的样本数据,两个表被连接在一起以创建此正文中显示的第一个表。

非常感谢大家!

2 个答案:

答案 0 :(得分:2)

NOT EXISTS运算符可用于执行此任务:

SELECT distinct Col1 ,  Col2
FROM table t
WHERE NOT EXISTS(
  SELECT 1 FROM table t1
  WHERE t.col1=t1.col1 AND t.col2 <> t1.col2
)

答案 1 :(得分:0)

如果我理解正确,那么您想要:

select col1, min(col2)
from t
group by col1
where min(col2) <> max(col2);

我认为第三列使您感到困惑。它似乎在您想要的逻辑中没有任何作用。