sql - 根据特定列值删除重复行
问题描述
我有一个表格数据,例如
+--------------------------------------+--------------------------------------+-----------+--------+
| 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
但结果不是基于特定值,而是基于字母排除。我需要一个条件,当重复行的媒体类型为语音时,应排除该行。对于没有回调值的其他唯一行,它应该返回媒体类型语音。
解决方案
你想要所有的行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
推荐阅读
- python - 使用 Python Beautiful Soup 在 Web 抓取中提取价值
- python - 检查numpy数组窗口中的元素是否有限的更快方法
- azure - 是否可以通过用户租户上的 ARM 模板在 Azure 上自动注册应用程序?
- c++ - 通过不考虑所有分隔符的分隔符循环分割字符串
- knockout.js - 剔除值AllowUnset 切换
- python - 根据一周中的天数向熊猫数据框添加行
- python - Pyathena 错误:None 类型没有属性获取
- ios - 你如何重新排序 SwiftUI 列表?
- ruby - 匹配数据结构的部分以实现相等,而不管它们在 rspec 中的内容如何
- amazon-web-services - AWS SES - 使用不同的账户发送电子邮件