繁体   English   中英

MySQL GROUP BY MAX两列

[英]MySQL GROUP BY MAX two columns

因此,我在数据库中获得了许多测试,每个测试都属于一个类别,每个“组”的测试都有一个“序列号”(排序的时间戳)。 每个测试都有通过或失败的结果,就像这样:

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的“ Basic”有“ 112233”和“ 223344”,因此我想忽略早期(较小) TEST_SN (第1,2,3,4和5行)中的所有测试。 由于“ 112233”是Advacted的唯一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行仍然存在。 我只想为每个TEST_CATSELECT具有MAX TEST_SN值的TEST_CAT

有任何想法吗?

首先,我们编写一个查询,以获取每个类别( 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

您不应在group by子句中使用test_name。 在放置test_name时,将为test-e和Basic创建一个有效的组,最大组为112233。您是否尝试在group by子句中仅保留“ test_cat”?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM