2011-04-05 109 views
26

我有一個包含下列項目的數據庫表:獲取最後不同的記錄集

id code value datetime timestamp 

在該表中唯一的值位於ID即主鍵。

我想根據日期時間值檢索此表中最後一組不同的記錄。例如,下面就讓我們說是我的表

id code value datetime    timestamp 
1 1023 23.56 2011-04-05 14:54:52 1234223421 
2 1024 23.56 2011-04-05 14:55:52 1234223423 
3 1025 23.56 2011-04-05 14:56:52 1234223424 
4 1023 23.56 2011-04-05 14:57:52 1234223425 
5 1025 23.56 2011-04-05 14:58:52 1234223426 
6 1025 23.56 2011-04-05 14:59:52 1234223427 
7 1024 23.56 2011-04-05 15:00:12 1234223428 
8 1026 23.56 2011-04-05 15:01:14 1234223429 
9 1025 23.56 2011-04-05 15:02:22 1234223430 

我想與ID的4,7,8檢索記錄,和9,即最後一組具有鮮明的代碼(基於時間值)的記錄。我所強調的僅僅是我試圖實現的一個例子,因爲這張表最終將包含數百萬條記錄和數百個單獨的代碼值。

我可以用什麼SQL語句來達到這個目的?我似乎無法完成一個單一的SQL語句。我的數據庫是MySQL 5.

回答

50

這應該適合你。

SELECT * 
FROM [tableName] 
WHERE id IN (SELECT MAX(id) FROM [tableName] GROUP BY code) 

如果id爲AUTO_INCREMENT,就沒有必要擔心這是更爲昂貴的計算日期時間,因爲最近的日期時間也將有最高的ID。

更新:從性能的角度來看,要確保有大量的記錄處理時idcode列索引。如果id是主鍵,則這是內置的,但您可能需要添加非聚集索引,其中包括codeid

+1

+1爲避免日期時間測試,如果自動增量...我冒昧地重新格式化答案。 – krtek 2011-04-05 15:16:53

+0

工程就像一個魅力!非常感謝。 – 2011-04-05 15:23:30

+1

@smdrager,非常不錯...節省了我的時間。 – vissu 2012-07-18 13:39:55

0

我會嘗試這樣的事:

select * from table 
where id in (
    select id 
    from table 
    group by code 
    having datetime = max(datetime) 
) 

(免責聲明:這不是測試)

如果有更大的日期時間該行也有較大的ID,由smdrager提出的解決方案更快。

5

試試這個:

SELECT * 
    FROM <YOUR_TABLE> 
WHERE (code, datetime, timestamp) IN 
(
    SELECT code, MAX(datetime), MAX(timestamp) 
    FROM <YOUR_TABLE> 
    GROUP BY code 
) 
+0

由於表有一個主鍵,所以你不必做這麼複雜的where子句。看到我的答案。 – krtek 2011-04-05 15:20:01

+0

@Krtek:同意,但這需要假定id是自動增量。 – Chandu 2011-04-05 15:27:21

+0

根本不,smdrager的答案確實,我的子查詢返回使用好的id,因爲'有'子句 – krtek 2011-04-05 15:46:13

1

這是老的文章,但測試與大表@smdrager答案是非常緩慢的。我對此的修復是使用「內連接」而不是「在哪裏」。

SELECT * 
FROM [tableName] as t1 
INNER JOIN (SELECT MAX(id) as id FROM [tableName] GROUP BY code) as t2 
ON t1.id = t2.id 

這工作真的很快。

+0

謝謝。下次我需要使用它時,我會嘗試一下。 – 2017-06-02 21:58:14