mysql - 如果其状态等于特定值,如何选择最小值?

时间:2016-06-24 09:16:34

标签: mysql sql database

如果他们是当天进行的第一次测试并且他们通过,我需要将所有测试从表中拉出来。由于MySQL只允许组中的一个字段,所以我很难找到一种方法来实现它。我周围有一次狩猎,到目前为止,我已经到了:

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;

它给了我两个测试时间的每个序列号的两条记录。逻辑上,如果第一个<最后一个单元失败了它的第一个测试,并且传递是第二个数字,所以我可以在代码中运行它并按照这种方式对它进行排序,但有没有办法在查询中执行它?

由于

2 个答案:

答案 0 :(得分:1)

两个查询之间的差异只是第一个and uut_status = 'passed'子句中的where部分。但是,可以在聚合期间使用聚合函数中的case表达式应用其他过滤器:

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并隐含else null跳过时case

然后,您可以轻松验证您的第一个<最后在查询本身(你现在都在同一行)。

在SQL中实际上有一种不那么难看的方法,但MySQL并不支持这种开箱即用的方式。但是,它可能更容易理解:

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 

聚合函数FILTER之后的max只指定聚合期间要考虑的行。

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

答案 1 :(得分:1)

  

由于MySQL只允许组中的一个字段,所以我很难挣扎   找到一种方法。

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

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')