如果他们是当天进行的第一次测试并且他们通过,我需要将所有测试从表中拉出来。由于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;
它给了我两个测试时间的每个序列号的两条记录。逻辑上,如果第一个<最后一个单元失败了它的第一个测试,并且传递是第二个数字,所以我可以在代码中运行它并按照这种方式对它进行排序,但有没有办法在查询中执行它?
由于
答案 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')