首页 > 解决方案 > 根据特定列值删除重复行

问题描述

我有一个表格数据,例如

+--------------------------------------+--------------------------------------+-----------+--------+
|            conversationid            |            participantid             | mediatype | rownum |
+--------------------------------------+--------------------------------------+-----------+--------+
| 01fda91b-6001-4904-b0bc-8c61aec654b4 | 13f954cb-4acb-4ab9-89e7-c48ece23a043 | callback  |      1 |
| 01fda91b-6001-4904-b0bc-8c61aec654b4 | 13f954cb-4acb-4ab9-89e7-c48ece23a043 | voice     |      2 |
| 0519386a-2b8f-403c-b65b-fd8cc3c09a32 | b033fe2f-a58c-4973-8006-54561b5a5bf7 | voice     |      1 |
| 085adea7-1deb-45d8-ae61-639255a689ce | 4151d364-5740-4dcf-b756-9772efaacb26 | voice     |      1 |
| 0c50e9c5-cbe0-4da5-9a8c-976efea255b2 | 8f1ee999-8454-4db9-8c24-68e773350f39 | callback  |      1 |
| 138da3c8-c118-4ddf-b294-57301261eb97 | cf2b643e-b07f-46c8-a52c-0cb5492e6485 | voice     |      1 |
| 613c51c6-3c8b-4b53-91de-de3cc004fa92 | 54a84468-e452-4820-9c8a-89904ff97d8d | callback  |      1 |
| 613c51c6-3c8b-4b53-91de-de3cc004fa92 | 54a84468-e452-4820-9c8a-89904ff97d8d | voice     |      2 |
+--------------------------------------+--------------------------------------+-----------+--------+  

我正在尝试根据特定列值(媒体类型)删除重复数据。

只有当对话ID 和参与ID 组合有两个值(语音、回调)时,我才需要排除带有meditype“语音”的行。

我试过代码

;with cte as(select conversationid,participantid ,
mediatype,row_number() over (partition by conversationid,participantid order by mediatype ) 
as rownum from #temp
)select * from cte where rownum=1 
order by conversationid,participantid ,mediatype

但结果不是基于特定值,而是基于字母排除。我需要一个条件,当重复行的媒体类型为语音时,应排除该行。对于没有回调值的其他唯一行,它应该返回媒体类型语音。

标签: sqlsql-server

解决方案


你想要所有的行mediatype = 'callback'或者mediatype = 'voice'如果没有也mediatype = 'callback'
在 WHERE 子句中应用这些条件:

select * from tablename t
where 
  mediatype = 'callback'
  or 
  not exists (
    select 1 from tablename
    where conversationid = t.conversationid and participantid = t.participantid
          and mediatype <> t.mediatype
  ) 

演示
结果:

> conversationid                       | participantid                        | mediatype | rownum
> :----------------------------------- | :----------------------------------- | :-------- | -----:
> 01fda91b-6001-4904-b0bc-8c61aec654b4 | 13f954cb-4acb-4ab9-89e7-c48ece23a043 | callback  |      1
> 0519386a-2b8f-403c-b65b-fd8cc3c09a32 | b033fe2f-a58c-4973-8006-54561b5a5bf7 | voice     |      1
> 085adea7-1deb-45d8-ae61-639255a689ce | 4151d364-5740-4dcf-b756-9772efaacb26 | voice     |      1
> 0c50e9c5-cbe0-4da5-9a8c-976efea255b2 | 8f1ee999-8454-4db9-8c24-68e773350f39 | callback  |      1
> 138da3c8-c118-4ddf-b294-57301261eb97 | cf2b643e-b07f-46c8-a52c-0cb5492e6485 | voice     |      1
> 613c51c6-3c8b-4b53-91de-de3cc004fa92 | 54a84468-e452-4820-9c8a-89904ff97d8d | callback  |      1

推荐阅读