从一列中选择不同的值,并从另一列中选择重复的值

时间:2017-03-14 23:04:33

标签: sql openedge progress-db

我有以下查询返回某些字段上有重复项的行

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_id,我希望那些根本不显示但是如果秘密值相同并且存在具有相同member_id的一些行且一些不同的行memeber_ids在这种情况下我想要不同的member_ids。

我可以处理一个查询,该查询将给出不同的成员ID,其中秘密值相同,但有多行。

2 个答案:

答案 0 :(得分:1)

大多数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;

答案 1 :(得分:1)

我在确切了解查询背后的意图时遇到了一些麻烦,但这应该会产生您想要的“结果数据”。如果这不适用于您的数据的更一般化的情况,我将尝试使其适应您的其他信息。

例如,假设具有相同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