从一列和另一

问题描述:

重复选择不同值我有以下查询,返回其中存在的一些字段重复的行,从一列和另一

SELECT customer_id, first_nm, last_nm, middle_nm, member_id, secret_field 
FROM cust_tbl 
WHERE secret_field <> '' AND 
     secret_field IN (SELECT secret_field 
           FROM cust_tbl 
           WHERE secret_field <> '' 
           GROUP BY secret_field 
           HAVING COUNT(secret_field) >= 2 

         )` 

它返回所希望的结果,例如,

customer_id | first_nm | last_nm | middle_nm | member_id | secret_field 
     1  | jane | doe |   | 1005 | secretvalue1 
     2  | jane | doe |   | 1005 | secretvalue1 
     5  | jane | doe |  m  | 1060 | secretvalue1 
     3  | jon  | doe |   | 1010 | secretvalue2 
     4  | jon  | doe |  a  | 3030 | secretvalue2 

问题是我想只有在“member_id”不重复的行,因此所需的返回值将是

customer_id | first_nm | last_nm | middle_nm | member_id | secret_field 
     1  | jane | doe |   | 1005 | secretvalue1 
     5  | jane | doe |  m  | 1060 | secretvalue1 
     3  | jon  | doe |   | 1010 | secretvalue2 
     4  | jon  | doe |  a  | 3030 | secretvalue2 

重复的member_id字段被删除。此外,还有一些行中唯一不同的是customer_id,我需要将这些行完全删除。

也就是说,如果所有具有相同secret_field值的行具有相同的member_ids,我希望那些根本不显示,但是如果秘密值相同,并且有一些具有某些相同member_ids的行,并且一些不同的memeber_ids我想在这种情况下不同的member_ids。

我可以使用一个查询,该查询会给出不同的成员id,其中秘密值是相同的,但有多行。

+0

用你正在使用的数据库标记你的问题。你如何选择你想要的行?为什么是1而不是2? –

+0

我需要secret_value相同的所有行,并且member_id不相同,但其中secret_value有多于1行的地方。 – TheRealKernel

大多数版本的SQL支持窗口函数。你会写为:

select c.* 
from (select c.*, 
      row_number() over (partition by secret_field, member_id order by member_id) as seqnum, 
      count(distinct member_id) over (partition by secret_field) as cnt 
     from cust_tbl c 
    ) c 
where seqnum = 1 and cnt > 1; 
+0

嗨戈登,试过这个,看起来这不支持我们的数据库。 – TheRealKernel

+0

窗口函数中'distinct'? –

+0

@vkp。 。 。它在大多数数据库中都受支持。还有其他解决方案。 –

我有一个有点麻烦准确理解其意图是在查询背后究竟,但这应该得到你想要的“结果数据”。如果这不适用于您的数据更广泛的情况下,我会尝试适应您的额外信息。

例如,这假设每个具有相同member_id的人都将具有相同的first_nm,last_nm和middle_nm以满足您的条件。如果情况并非如此,我们仍然可以这样做,但是我们必须选择在决定显示的行上显示哪个名称。

SELECT min(customer_id), count(distinct customer_id), first_nm, last_nm, middle_nm, member_id, secret_field 
FROM cust_tbl 
WHERE secret_field <> '' AND 
    secret_field IN (SELECT secret_field 
          FROM cust_tbl 
          WHERE secret_field <> '' 
          GROUP BY secret_field 
          HAVING COUNT(secret_field) >= 2 

        ) 
group by first_nm, last_nm, middle_nm, member_id, secret_field 
having count(distinct customer_id) > 1