2010-09-28 110 views
4

一個條件,即最近的行比方說,我有一個表:選擇匹配的SQLite

Name, status, timestamp 

我想選擇匹配狀態=「積極的」,但該行只有那些具有最近的時間戳爲他們每個人。因此,如果有行是這樣的:

Bob, active, 5/10/2010 
Bob, active, 6/12/2010 
Ann, inactive, 6/12/2000 
Ann, active, 9/3/2009 
Ann, active, 9/25/2010 

我想它返回:

Bob, active, 6/12/2010 
Ann, active, 9/25/2010 

我怎樣才能做到這一點?我使用SQLite,如果它很重要。

謝謝。

+0

我已經添加了「每個組最大的標籤」。請遵循該標籤,瞭解與您的問題幾乎完全相同的其他問題。 – 2010-09-28 03:54:22

回答

2

下面是如何解決這類問題。你想每一行對應一個名稱,沒有其他行具有相同的名稱和更大的時間戳存在:

SELECT t1.* 
FROM MyTable t1 
LEFT OUTER JOIN MyTable t2 ON t1.name = t2.name 
    AND t1.timestamp < t2.timestamp 
WHERE t2.name IS NULL 

但是,這仍然可以返回多行的每一個名字,因爲你可以有多個行了給定的名稱具有相同的最大時間戳。因此,使用主鍵作爲決勝:

SELECT t1.* 
FROM MyTable t1 
LEFT OUTER JOIN MyTable t2 ON t1.name = t2.name 
    AND (t1.timestamp < t2.timestamp OR t1.timestamp = t2.timestamp AND t1.id < t2.id) 
WHERE t2.name IS NULL 

我假設id是在這個例子中一個主鍵,但其他任何唯一的列會增加值按時間順序會工作。

0

比爾,我相信我現在正在工作(似乎在不同的測試數據上選擇正確的行)。我使用了你的查詢,並添加了條件t1.active_status!='active',因爲這會處理任何不活動的事情。整個查詢看起來像:

SELECT t1.*<br> 
FROM TrialTypes t1<br> 
LEFT OUTER JOIN TrialTypes t2 ON t1.name = t2.name <br> 
    AND (t1.start_date < t2.start_date OR t1.start_date = t2.start_date AND t1.rowid < t2.rowid)<br> 
WHERE t2.name IS NULL and t1.active_status != 'active'<br> 

非常感謝您的幫助。很明顯,我比新的基本SQL查詢更新。這有助於教我,謝謝!