首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mysql --如果min值的状态等于特定值,如何选择它?

问mysql --如果min值的状态等于特定值,如何选择它?
EN

Stack Overflow用户
提问于 2016-06-24 09:16:34
回答 2查看 494关注 0票数 0

我需要把所有的测试都从桌子上拿出来,如果它们是那天的第一次测试,并且它们通过了。因为到那时MySQL只允许一个组中的一个字段,所以我很难找到一种方法来实现它。我已经四处搜寻过了,到目前为止我要做的是:

代码语言:javascript
复制
select distinct 
    uut_serial_number,  
    MIN(START_DATE_TIME) as 'first test passed' 
from 
    uut_result 
where
    date(START_DATE_TIME) = '2016-06-16' 
and 
    uut_status = 'passed' 
group by uut_serial_number 

union

select distinct 
    uut_serial_number,  
    MIN(START_DATE_TIME) as 'first test taken' 
from 
    uut_result 
where
    date(START_DATE_TIME) = '2016-06-16' 
group by uut_serial_number;

它给了我两个记录,每个序列号有两个测试时间。从逻辑上说,如果第一个< code然后这个单元失败了它的第一个测试,并且pass是第二个图形,那么我可以以代码的方式运行它并对它们进行排序,但是在查询中有什么方法可以做到吗?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-24 09:29:15

两个查询之间的区别仅在于第一个查询的and uut_status = 'passed'子句中的这个部分where。但是,可以在聚合过程中使用聚合函数中的case表达式应用附加筛选器:

代码语言:javascript
复制
select uut_serial_number,  
     , MIN(CASE WHEN uut_status = 'passed'  THEN START_DATE_TIME END) as 'first test passed' 
     , MIN(START_DATE_TIME) as 'first test taken' 
  from 
       uut_result 
 where
       date(START_DATE_TIME) = '2016-06-16' 
 group by uut_serial_number 

对于这个uut_status = 'passed'表达式,只考虑那些满足min的行(其他的行被min忽略,因为聚合函数忽略null,跳过null时else null被隐含在case中)。

然后,您可以轻松地在查询本身中验证您的第一个< last (现在两者都在同一行中)。

实际上,有一种不那么难看的方法可以用SQL编写,但是MySQL并不支持这一点。然而,可能更容易理解:

代码语言:javascript
复制
select uut_serial_number,  
     , MIN(START_DATE_TIME) FILTER(WHERE uut_status = 'passed') as 'first test passed' 
     , MIN(START_DATE_TIME) as 'first test taken' 
  from 
       uut_result 
 where
       date(START_DATE_TIME) = '2016-06-16' 
 group by uut_serial_number 

聚合函数max后面的max只指定在聚合过程中要考虑哪些行。

我最近写了一篇关于filter的文章,还解释了case的工作原理:

票数 1
EN

Stack Overflow用户

发布于 2016-06-24 09:32:45

因为到那时MySQL只允许一个组中的一个字段,所以我很难找到一种方法来实现它。

MySQL支持按多列分组。您可以使用GROUP BY + HAVING:

代码语言:javascript
复制
SELECT
    uut_serial_number, uut_status
FROM
    uut_result 
WHERE
    DATE(START_DATE_TIME) = '2016-06-16'
GROUP BY uut_serial_number, uut_status
HAVING
    uut_status = 'passed' AND
    MIN(START_DATE_TIME) = (
        SELECT MIN(START_DATE_TIME) FROM uut_serial_number
        WHERE DATE(START_DATE_TIME) = '2016-06-16')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38009731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档