我有以下查询返回某些字段上有重复项的行
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,其中秘密值相同,但有多行。
答案 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