2017-07-18 53 views
1

我遇到了一个非常有趣的问题,当处理行应该是相似的,但彼此之间由一个或多个缺失的值不同。我想要做的是执行一个查询,将所有相似的行折叠(分组)为包含所有(或尽可能多)列的值的条目,以便删除缺失的值。拼图相似的行有不同的偶尔缺失值

我将分裂这个问题成以下两个子问题:

问题A)

鉴于表:

|--------------------------| 
| col1 | col2 | col3 | 
|--------------------------| 
| a |  | c | 
| a | b |  | 
|  |  | c | 
| a | b |  | 
|  | b | c | 
| a |  | c | 
|--------------------------| 

创建查询返回 - >(A,B, c)

问题B)

Giv恩表:

|--------------------------| 
| col1 | col2 | col3 | 
|--------------------------| 
| a |  | c | 
| a | b |  | 
|  |  | c | 
| a | b |  | 
|  | b | c | 
| a |  | c | 
| d |  | f | 
| d |  |  | 
|  | e | f | 
| d | e |  | 
| d |  | f | 
|--------------------------| 

创建一个查询返回 - >(A,B,C),(d,E,F)

如何任何这是可以实现的任何想法或提示?

+1

A 3元组,如'(A,B,C)'存在只要'A'涉及'B','B'涉及'C' **和* *'a'与'c'有关。它是否正确? –

+1

为什么不是{d,e,c}? – JeffUK

+0

@JeffUK'e'与'c'无关,'d'与'c'都不相关。 –

回答

0

您可以尝试在col1列上分组,然后选择其他两列中的MAX()。如果仔细观察第一个表格,您会看到col2col3的唯一值分别为bc。同样的推理适用于您的第二个表格,但该表格有col1两个不同的值。

SELECT 
    col1, MAX(col2) AS col2, MAX(col3) AS col3 
FROM yourTable 
WHERE col1 IS NOT NULL 
GROUP BY col1 

演示在这里:

Rextester

+0

谢谢!有没有一种方法可以在每一列上重复迭代,然后从每个查询结果中提取唯一的出现? –

+0

@AlexChi我不明白你的问题。除了这个查询,你还需要什么?更新你的问题。 –

+0

我需要为每列重复此查询。首先,我将按col1分组,然后按col2分组,然后按col3分组等。当然,这些查询的输出会有很大的重叠,所以我需要放弃重复的发生。执行此操作的最佳方式是什么? –

0

如果一个3元组,只要col1有关col2存在,col1有关col3col2有关col3,那么你可以尝试下面的查询:

SELECT DISTINCT t1.col1, t2.col2, t3.col3 
FROM mytable AS t1 
-- col1 is realted to col2 
LEFT JOIN mytable AS t2 ON t1.col1 = t2.col1 AND t2.col2 IS NOT NULL 
-- col1 is related to col3 
LEFT JOIN mytable AS t3 ON t1.col1 = t3.col1 AND t3.col3 IS NOT NULL 
WHERE t1.col1 IS NOT NULL 
     -- col2 is related to col3 
     AND EXISTS (SELECT 1 
        FROM mytable AS t4 
        WHERE t4.col2 = t2.col2 AND t4.col3 = t3.col3); 

Demo here

+0

谢谢!试图将此示例扩展到我的生产数据:) –