根据现有结果获取派生状态列的最佳方法是啥
Posted
技术标签:
【中文标题】根据现有结果获取派生状态列的最佳方法是啥【英文标题】:What is the best way to get a derived status column based on existing result根据现有结果获取派生状态列的最佳方法是什么 【发布时间】:2020-09-03 14:29:26 【问题描述】:我有一张桌子:
------------------------
testId | runId |result
------------------------
**1 | 11 |0**
**1 | 12 |1**
**1 | 13 |1**
**1 | 14 |1**
**2 | 21 |0**
**3 | 31 |1**
**4 | 41 |1**
**4 | 42 |1**
**4 | 43 |1**
**5 | 51 |0**
**5 | 52 |0**
**5 | 53 |0**
**6 | 61 |1**
**6 | 62 |0**
**6 | 63 |1**
对于一个测试,可以有多个运行/执行。每次运行都有一个结果。这里对于结果列,0 是失败,1 是通过。 我要查询 --如果所有的run PASS for test,则OverallStatus为PASS --如果一个测试的所有运行失败,OverallStatus 为 FAIL --如果其中一些通过而一些失败,那么OverallStaus就是缺陷
我想从上表中得到一个输出,比如
testId |numOfRun |OverallStatus
1 | 4 |缺陷
2 | 1 |失败
3 | 1 |通过
4 | 3 |通过
5 | 3 |失败
6 | 3 |缺陷
【问题讨论】:
用您正在使用的数据库标记您的问题。 【参考方案1】:你可以使用条件聚合
select testId,
numOfRun,
case when numOfRun = pass then 'pass'
when numOfRun = fail then 'fail'
else 'defect'
end as OverallStatus
from (
select testId,
count(*) numOfRun,
sum(case when result = 0 then 1 else 0 end) as fail,
sum(case when result = 1 then 1 else 0 end) as pass
from table
group by testId
) t
【讨论】:
谢谢。该解决方案非常适合我,但我想知道对于 Web 项目中大约一百万行的表会有什么性能影响。【参考方案2】:我建议一步完成:
select testid,
(case when min(result) = 1 then 'Pass'
when max(result) = 0 then 'Fail'
else 'Defect'
end) as overall_status
from t
group by testid;
编辑:
根据您的评论:
select testid,
(case when min(result) = N'TestSuccess' then 'Pass'
when max(result) = N'TestFailure' then 'Fail'
else 'Defect'
end) as overall_status
from t
group by testid;
【讨论】:
谢谢,我明白了这里的聪明技巧。但在我的实际表中,结果是 nvarchar 并存储为“TestSuccess”、“TestFailure”。 @rasoo 。 . .那么,您接受了一个不正确的答案,因为您的问题不正确。但是这个想法很容易适应你的字符串。 。我已经提到你的答案比以前更聪明,而且你的答案肯定更有效率。但是你不能说另一个答案是错误的。好吧,不知何故,以前的答案对我来说是可以接受的。以上是关于根据现有结果获取派生状态列的最佳方法是啥的主要内容,如果未能解决你的问题,请参考以下文章
检查文档是不是存在并根据 CosmosDB 中的结果插入的最佳方法是啥?
根据当前日期+时间查询 JPA 实体以获取实例的最佳方法是啥?
Python pandas:对分组的第一行和最后一行应用操作并将结果添加为列的最佳方法是啥?