【问题标题】:Query to extract only records which have failed查询以仅提取失败的记录
【发布时间】:2020-05-31 23:08:44
【问题描述】:

我在为下表编写 SQL 时需要帮助。我有一个包含两列(名称和状态)的表。

Name    Status
Kevin   success 
Mark    fail 
Mark    success 
Mike    success 
Yann    fail 
Yann    success 
George  fail
Boi     Fail

从上表中,我想只提取失败的记录以及失败然后成功的记录。基本上我想排除刚刚成功的记录。

【问题讨论】:

  • 请向我们展示您的尝试 - SO 不是代码编写服务。

标签: sql sql-server tsql select


【解决方案1】:

基本上我想排除刚刚成功的记录。

如果您想要name 至少有一个非'success' 状态的所有记录,您可以使用exists

select t.*
from mytable t
where exists(
    select 1 from mytable t1 where t1.name = t.name and t1.status <> 'success'
)

或者,如果您想要一个至少具有一个非'success' 状态的names 列表,那么您可以使用聚合和带有having 子句的过滤器:

select name
from mytable
group by name
having max(case when status <> 'success' then 1 else 0 end) = 1

【讨论】:

    【解决方案2】:

    另一种选择是使用WITH TIES

    不清楚您是想要所有记录还是只需要不同的名称

    示例

    Declare @YourTable Table ([Name] varchar(50),[Status] varchar(50))
    Insert Into @YourTable Values 
     ('Kevin','success')
    ,('Mark','fail')
    ,('Mark','success')
    ,('Mike','success')
    ,('Yann','fail')
    ,('Yann','success')
    ,('George','fail')
    ,('Boi','Fail')
    
    Select top 1 with ties *
     From @YourTable
     Order By min(case when status='Fail' then 0 else 1 end) over (partition by [Name] )
    

    退货

    Name    Status
    Boi     Fail
    George  fail
    Mark    fail
    Mark    success
    Yann    fail
    Yann    success
    

    凯文和迈克被排除在外

    【讨论】:

      猜你喜欢
      • 2012-01-12
      • 1970-01-01
      • 1970-01-01
      • 2017-04-12
      • 1970-01-01
      • 2014-07-14
      • 2022-08-22
      • 2014-12-23
      • 1970-01-01
      相关资源
      最近更新 更多