【问题标题】:Over Partition to find duplicates and remove them based on criteria SQLOver Partition 以查找重复项并根据条件 SQL 删除它们
【发布时间】:2018-12-06 04:34:25
【问题描述】:

我希望每个人都做得很好。我有一个我无法弄清楚的两难境地。 我正在尝试为不重复的字段找到唯一值。

例如:

表 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 使用 row number() Over Partition 语法以升序获取数字。

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

例子:

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

现在看看 Col1 的值为 12,而 Col2 的值为 B、C、D。

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

所以最后我希望看到这样的结果表:

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

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

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

更新**

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

所以 Col1 来自表 a,Col2 来自表 b。

表 a 中 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  |

以上是两个表的示例数据,它们为了创建显示在此正文中的第一个表而连接起来。

非常感谢大家!

【问题讨论】:

  • ....如果您在连接的结果集中有重复项,几乎总是正确的方法是在连接点处或之前删除重复项。请向我们展示原始表中的数据 - 我敢打赌,您可以删除您的 tableB(可能基于 colX 的真实情况)。另外,您是只想显示记录,还是需要DELETE重复记录?
  • @Clockwork-Muse 我更新了我的问题以反映连接的两个表。我的目标是找到唯一值,其中 col 1 仅存在于 col 2 的 1 个唯一值中。所以看看我的示例 Value 123 from col 1 有两个实例,其中 col 2 中的值为 A 所以它通过了测试并且它应该在我的结果中返回 123 的值。然而,来自 col 1 的 value 12 在 col 2 (B,C,D) 中有 3 个不同的值,这意味着 value 12 与三个不同的所有者共享相同的值。我想删除任何这样的实例。
  • 啊。不,你肯定需要那里的加入。 @GordonLinoff 是正确的,col3 与查询无关。
  • @Clockwork-Muse 我最终使用了 GordonLinoff 解决方案的变体。感谢您提供链接。

标签: sql db2


【解决方案1】:

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
)

【讨论】:

  • 我已尝试过此操作,但查询超时。我提供了我认为重要的信息的更新。
【解决方案2】:

如果我理解正确,你想要:

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

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

【讨论】:

  • Col 3 是语法的行号分区部分。 Col2 实际上是另一个表 (b) 中的另一列,我用来与 Col1 的表 (a) 连接。所以表 a 有不同格式的所有者,表 b 将它们转换为可理解的值,因此当 col 2 中的值相同时,为什么 col 1 中的某些值会填充两次(123 示例)。一旦我的 db2 应用程序启动,我将尝试此语法并让您知道结果
  • 我已经更新了我的问题以反映我用来获取 Col2 的语法结构
  • 我最终使用了这种语法的变体,它完成了工作。非常感谢您的帮助
猜你喜欢
  • 2019-04-13
  • 1970-01-01
  • 2020-07-01
  • 1970-01-01
  • 2010-10-19
  • 1970-01-01
  • 2019-05-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多