【问题标题】:Finding duplicate records查找重复记录
【发布时间】:2019-09-24 15:08:35
【问题描述】:

表格如下:

Request#  type  status
123         R     partially complete 
123         S     complete
345         S     partially complete
345         S     complete

R 表示短请求,S 表示长请求。当状态为“完成”时,每个请求类型都会变为 S。我需要找到所有已完成的“R”类型的请求

select * 
from table 
where type ='R' and status='partially complete' OR 
      type ='s' and status='complete'

预期结果

Request#  type  
123         R

【问题讨论】:

    标签: sql oracle group-by aggregation


    【解决方案1】:

    这是对巴巴罗斯解决方案的概括:

    select Request#
    from "table" 
    group by Request#
    having sum(case when status = 'complete' then 1 else 0 end) > 0 and
           sum(case when type = 'R' then 1 else 0 end) > 0;
    

    【讨论】:

    • Barbaros 在属格中不带撇号加s。所以,它应该是:This is a generalization of Barbaros' solution :-)
    • @TimBiegeleisen 。 . .你知道最后的“s”是否发音为“s”吗?
    • 它的音标发音为Barbarosis,但我们只是在结尾的s 之后 标记一个撇号。我对此没有任何解释,但我可以说's 是来自中古英语的所有格的残余。
    【解决方案2】:

    我想你想要这个

    select Request#, min(type) as type
      from "table" 
     group by Request#
     having min(status)='complete'
    

    【讨论】:

      【解决方案3】:

      一种简单的方法使用聚合:

      SELECT
          request
      FROM yourTable
      GROUP BY
          request
      HAVING
          COUNT(CASE WHEN type = 'R' AND status = 'partially complete' THEN 1 END) > 0 AND
          COUNT(CASE WHEN type = 'S' AND status = 'complete' THEN 1 END) > 0;
      

      我们也可以使用自连接来表达这一点:

      SELECT DISTINCT t1.request
      FROM yourTable t1
      INNER JOIN yourTable t2
          ON t1.request = t2.request AND
             t2.type = 'S' AND t2.status = 'complete'
      WHERE
          t1.type = 'R' AND
          t1.status = 'partially complete';
      

      【讨论】:

        猜你喜欢
        • 2016-07-03
        • 2014-03-18
        • 1970-01-01
        • 2017-03-20
        • 2019-03-28
        • 2010-10-25
        • 2015-01-15
        • 2015-02-14
        相关资源
        最近更新 更多