【问题标题】:Remove duplicate row based on specific column value根据特定列值删除重复行
【发布时间】:2019-08-17 07:22:50
【问题描述】:

我有一个表格数据,比如

+--------------------------------------+--------------------------------------+-----------+--------+
|            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 voice。

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    如果没有mediatype = 'callback',您希望所有行都带有mediatype = 'callback'mediatype = 'voice'
    在 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
      ) 
    

    请参阅demo
    结果:

    > 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
    

    【讨论】:

    • 如果在not exists ... 之前添加mediatype = 'voice' and,您认为会导致子查询短路吗?
    • @shawnt00 要求如果mediatype = 'voice'也有mediatype = 'callback',就去掉,所以不就错了。
    • 布尔代数:A + B = A + ~AB。在此设置中,mediatype = callback 的否定是 mediatype = voice。我在发布之前尝试了查询,所以我知道它们都有效。但出于同样的原因,短路可能会阻止它首先到达那里。
    • 要求为:NOT (mediatype = 'voice' AND EXISTS (mediatype = 'callback')),相当于:mediatype = 'callback' OR NOT EXISTS...'。现在,任何 rdbms 都不能保证短路。
    【解决方案2】:

    我实际上并不清楚为什么您的原始查询不起作用(因为“语音”行将在它们之前没有“回调”时为 #1)但是当这些是您仅有的三个列值时,这是另一种有效的方法结果需要:

    select conversationid, participant, min(mediatype) as mediatype
    from #temp
    group by conversationid, participantid;
    

    如果您不想依赖字母顺序,请使用 case 表达式:

    select conversationid, participant,
        case min(case mediatype when 'callback' then 1 when 'voice' then 2 end)
            when 1 then 'callback' when 2 then 'voice' end as mediatype
    from #temp
    group by conversationid, participantid;
    

    【讨论】:

      猜你喜欢
      • 2022-01-23
      • 1970-01-01
      • 2022-11-17
      • 2017-11-26
      • 2019-05-29
      • 2021-02-27
      • 1970-01-01
      • 1970-01-01
      • 2021-06-24
      相关资源
      最近更新 更多