2014-12-05 54 views
0

我有一張表,看起來像這樣,我想獲得每個loc_id的最新insp_date的ID(insp_id)。MySQL選擇最新日期 - 單表

create table insp (
    insp_id int (10), 
    loc_id int (11), 
    insp_type varchar (150), 
    insp_date date , 
    insp_active tinyint (2), 
    insp_created timestamp , 
    insp_modified timestamp 
); 

我嘗試了「IN」的策略,從Select latest record in table (datetime field)等,而這給了我雙倍因爲一個loc_id最新的日期可能會比非最新另一:

SELECT insp_id, loc_id, insp_active, insp_date 
FROM insp 
WHERE insp_active = 1 
AND insp_date IN(SELECT MAX(insp_date) FROM insp WHERE insp_active = 1 GROUP BY loc_id) 
ORDER BY loc_id ASC, insp_date DESC; 

我安裝一個SQL小提琴,但添加各種GROUP BY和MAX似乎並沒有得到它。我覺得我需要加入一個子查詢或類似的東西,但在這一點上我不確定。

http://sqlfiddle.com/#!2/f95e0/1

感謝, 安德魯

+0

根據記錄,類似的事情在這裏提出:http://stackoverflow.com/questions/7745609/sql-select-only-rows-with-max-value-on-a-column – ptrk 2014-12-05 21:53:21

回答

1

您需要檢索MAX日期爲每個位置,然後,將MAX insp_id此日期

查詢1

SELECT insp.loc_id, max(insp.insp_id) 
FROM insp 
INNER JOIN 
    (SELECT loc_id, max(insp_date) as insp_date 
    FROM insp 
    WHERE insp_active = 1 
    GROUP BY loc_id) AS mdate ON mdate.loc_id = insp.loc_id AND 
            mdate.insp_date = insp.insp_date 
WHERE insp_active = 1 
GROUP BY insp.loc_id 

Results

| LOC_ID | MAX(INSP.INSP_ID) | 
|--------|-------------------| 
|  1 |     1 | 
|  2 |    40 | 
|  3 |    48 | 
|  4 |    37 | 
|  5 |    49 | 
|  6 |    39 | 
|  7 |    50 | 
|  8 |    46 | 

UPDATE:

如果只有一個特定日期積極的檢查,這是始終處於活動狀態的最新的,你可以這樣做:

SELECT insp.loc_id, insp.insp_id 
FROM insp 
INNER JOIN 
    (SELECT loc_id, max(insp_date) as insp_date 
    FROM insp 
    WHERE insp_active = 1 
    GROUP BY loc_id) AS mdate ON mdate.loc_id = insp.loc_id AND 
            mdate.insp_date = insp.insp_date 
WHERE insp_active = 1 
+0

謝謝,這工作得很好。 – andrewteg 2014-12-05 18:23:21

+0

看到更新,並不總是我的使用情況,但看看它可能爲其他人。好主意。 – andrewteg 2014-12-05 18:24:16

1

做一個join和聚集:

select i.* 
from insp i join 
    (select loc_id, max(isp_date) as maxid 
     from insp 
     group by loc_id 
    ) lm 
    on i.loc_id = lm.loc_id and i.isp_date = lm.maxid; 

,您仍然可以進行重複的風險,如果重複相同位置的最大日期。

+0

謝謝,我加入了insp_active = 1條款(我忘了在?中特別提到),它效果很好。看起來像@ fabien一樣 - 解決方案...希望我能給予同等的讚譽。 – andrewteg 2014-12-05 18:28:17

0
SELECT insp_id 
FROM insp 
WHERE insp_active = 1 
GROUP BY loc_id 
ORDER BY insp_date DESC; 
+0

謝謝,儘管我覺得應該這樣,但這並不適合我。欣賞這個想法,但現在認爲我已經用其他解決方案得到了它。 – andrewteg 2014-12-05 18:26:51

+0

http://sqlfiddle.com/#!2/f95e0/18 驗證它是否給出與您選擇的答案相同的結果(儘管順序不同) – Riftus 2014-12-05 18:35:07

+0

當我轉到該選項時,或者在我的SQL上運行SQL時它給了我loc_id 2的insp_id 45,但我正確選擇的答案給出了loc_id 2的insp_id 40. – andrewteg 2014-12-05 19:09:44

0

子查詢最由這本書的解決方案,但我用逃脫的東西少的標準,因爲它是嵌套被允許在MySQL前:

select max(concat_ws('|', insp_date, insp_id)) as result, loc_id 
from insp 
group by loc_id; 

你會得到這樣的:

2014-01-01|12 
2014-02-14|19 
... 

那麼你顯然需要將它拆分到你的應用中。請注意,這是非常具體的MySQL方言,並且性能不是很好,但嵌套查詢不是(或者至少不用)。

http://sqlfiddle.com/#!2/f95e0/23/0

+0

謝謝,絕對是一種獨特的方法來記住未來的想法。 – andrewteg 2014-12-05 18:26:20