MySQL GROUP BY MAX两列

时间:2017-04-06 00:09:56

标签: mysql group-by

所以我在数据库中进行了多次测试,每个测试属于一个类别,每个测试的“组”都有 “序列号”(各种时间戳)。每个测试都有一个通过或失败的结果,如下所示:

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 s“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行仍然存在。我想SELECTMAX

每个TEST_SN TEST_CAT值的行template

任何想法?

2 个答案:

答案 0 :(得分:1)

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

 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

答案 1 :(得分:0)

您不应在group by子句中使用test_name。在放置test_name时,test-e& amp;最大值为112233的基本值。您是否尝试仅保留" test_cat"在你的group by子句中?