我需要把所有的测试都从桌子上拿出来,如果它们是那天的第一次测试,并且它们通过了。因为到那时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;它给了我两个记录,每个序列号有两个测试时间。从逻辑上说,如果第一个< code然后这个单元失败了它的第一个测试,并且pass是第二个图形,那么我可以以代码的方式运行它并对它们进行排序,但是在查询中有什么方法可以做到吗?
谢谢
发布于 2016-06-24 09:29:15
两个查询之间的区别仅在于第一个查询的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,跳过null时else null被隐含在case中)。
然后,您可以轻松地在查询本身中验证您的第一个< last (现在两者都在同一行中)。
实际上,有一种不那么难看的方法可以用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 聚合函数max后面的max只指定在聚合过程中要考虑哪些行。
我最近写了一篇关于filter的文章,还解释了case的工作原理:
发布于 2016-06-24 09:32:45
因为到那时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')https://stackoverflow.com/questions/38009731
复制相似问题