2008-12-24 73 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