2008-12-24 90 views
10

簡而言之,我有一個表格,其中包含時間戳列。我想獲得最新(即最大值)時間戳的行。目前,我這樣做:SQLite中WHERE子句中的聚合函數

SELECT * FROM table ORDER BY timestamp DESC LIMIT 1 

但我寧願做這樣的事情:

SELECT * FROM table WHERE timestamp=max(timestamp) 

然而,SQLite的拒絕此查詢:

SQL error: misuse of aggregate function max() 

documentation證實了這一點行爲(頁面底部):

聚合函數只能在SELECT語句中使用。

我的問題是:是否有可能編寫一個查詢來獲取具有最大時間戳的行而無需對select進行排序並將返回行數限制爲1?這似乎應該是可能的,但我想我的SQL-fu並不適合。

回答

16
SELECT * from foo where timestamp = (select max(timestamp) from foo) 

,或者,如果SQLite的治療上作爲子查詢臺堅稱,

SELECT * from foo where timestamp in (select max(timestamp) from foo) 
+0

工程很漂亮,謝謝。我知道這一定很簡單。 – 2008-12-24 01:06:22

+0

只是好奇,子查詢是否會導致sqlite處理該表兩次,或者被優化了嗎? – 2008-12-24 02:30:58

1

我想我現在已經回答了這個問題5倍,在過去的一週,但我太累了,找到了鏈接到那些現在之一,所以這裏又是...

SELECT 
    * 
FROM 
    table T1 
LEFT OUTER JOIN table T2 ON 
    T2.timestamp > T1.timestamp 
WHERE 
    T2.timestamp IS NULL 

你基本上找沒有其他行匹配晚於它的行。

注意:正如評論中指出的那樣,這種方法在這種情況下表現不佳。對於每個客戶需要最後一行的情況(作爲示例),它通常會更好地工作(對於SQL Server至少)。

1

,你可以簡單地做

SELECT *,MAX(時間戳)FROM表

編輯: 作爲聚合函數不能用這樣的過程中它的錯誤。我猜SquareCog有什麼建議是最好的事情

SELECT * FROM table WHERE timestamp = (select max(timestamp) from table) 
4

皮膚貓有很多方法。

如果您有一個具有自動增量功能的標識列,那麼如果您通過標識返回最後一條記錄(由於列索引)而導致更快的查詢,除非您希望將索引置於時間戳列。

SELECT * FROM TABLE ORDER BY ID DESC LIMIT 1