2017-04-06 171 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