2017-04-06 134 views
0

因此,我在数据库中进行了大量测试,每个测试都属于一个类别,每个测试“组”都有一个“序列号”(序列号时间戳) 。每个测试有通过或失败的结果,就像这样:MySQL GROUP BY MAX两列

TEST Table 
TEST_ID  TEST_NAME TEST_CAT TEST_SN  RESULT 
1   test_a  Basic  112233  Pass 
2   test_b  Basic  112233  Pass 
3   test_c  Basic  112233  Pass 
4   test_d  Basic  112233  Fail 
5   test_e  Basic  112233  Pass 
6   test_a  Basic  223344  Fail 
7   test_b  Basic  223344  Pass 
8   test_c  Basic  223344  Pass 
9   test_d  Basic  223344  Fail 
10   test_w  Advacned 112233  Fail 
11   test_x  Advacned 112233  Pass 
12   test_y  Advacned 112233  Pass 
13   test_z  Advacned 112233  Pass 

我试着去制作一个查询每个类别,其中TEST_SN最高只返回行。 所以结果我试着回应该是这样的:

TEST_ID  TEST_NAME TEST_CAT TEST_SN  RESULT 
6   test_a  Basic  223344  Fail 
7   test_b  Basic  223344  Pass 
8   test_c  Basic  223344  Pass 
9   test_d  Basic  223344  Fail 
10   test_w  Advacned 112233  Fail 
11   test_x  Advacned 112233  Pass 
12   test_y  Advacned 112233  Pass 
13   test_z  Advacned 112233  Pass 

因为有TEST_SN的“112233”和“223344”的“基本”,我想忽略从早期 所有测试(小) TEST_SN(第1,2,3,4和5行)。由于“112233”是Advacned中唯一的TEST_SN,我想要 保留所有这些行(10,11,12和13)。

我可以接近这个查询:

SELECT 
    t.test_id, 
    t.test_name, 
    t.test_cat, 
    MAX(t.test_sn), 
    t.result 
FROM 
    car_test t 
GROUP BY 
    t.test_name, t.test_cat 

但继承人我得到什么:

TEST_ID  TEST_NAME TEST_CAT TEST_SN  RESULT 
1   test_a  Basic  223344  Pass 
2   test_b  Basic  223344  Pass 
3   test_c  Basic  223344  Pass 
4   test_d  Basic  223344  Fail 
5   test_e  Basic  112233  Fail 
10   test_w  Advanced 112233  Fail 
11   test_x  Advanced 112233  Pass 
12   test_y  Advanced 112233  Pass 
13   test_z  Advanced 112233  Pass 

第5行仍然存在。我想要SELECT只有那些有MAX

任何想法?

回答

1

首先,我们编写一个查询,获取每个类别(test_cat)的最高值(MAX)test_sn。就像这样:

SELECT t.test_cat 
     , MAX(t.test_sn) AS max_test_sn 
    FROM car_test t 
    GROUP BY t.test_cat 

然后,我们可以使用查询作为另一个查询的内嵌视图。 (上面的查询返回一个结果,我们可以引用代替表名。)作为一个简单的例子:

SELECT s.test_cat 
     , s.max_test_sn 
    FROM (SELECT t.test_cat 
       , MAX(t.test_sn) AS max_test_sn 
      FROM car_test t 
      GROUP BY t.test_cat 
      ORDER BY t.test_cat 
     ) s 
    ORDER BY s.test_cat 

现在,我们可以添加一个JOIN原始表,只检索匹配的行内联视图查询返回的行。例如:

SELECT r.test_id 
     , r.test_name 
     , r.test_cat 
     , r.test_sn 
     , r.result 
    FROM (SELECT t.test_cat 
       , MAX(t.test_sn) AS max_test_sn 
      FROM car_test t 
      GROUP BY t.test_cat 
      ORDER BY t.test_cat 
     ) s 
    JOIN car_test r 
    ON r.test_cat = s.test_cat 
    AND r.test_sn = s.max_test_sn 
    ORDER 
    BY r.test_id 
+0

像魅力一样工作。谢谢。 – mcmurphy

0

你不应该在group by子句中使用test_name。正如将test_name设置为test-e & Basic的最大值为112233的有效组。您是否尝试在group by子句中只保留“test_cat”?

+0

感谢您的回复。在GROUP BY中仅使用'test_cat'只会返回第10行和第1行。 – mcmurphy