在SQLite的WHERE子句中聚合函数
-
23-08-2019 - |
题
简单地说,我有一个表,除其他事项外,用于时间戳的列。我想最近(即最大价值)时间戳获得该行。目前,我这样做:
SELECT * FROM table ORDER BY timestamp DESC LIMIT 1
但我宁愿做这样的事情:
SELECT * FROM table WHERE timestamp=max(timestamp)
然而,SQLite的拒绝该查询:
SQL error: misuse of aggregate function max()
在文档证实了这一行为(页面底部):
聚合函数可以仅在一个SELECT语句中使用。
我的问题是:是否有可能编写一个查询来获取具有最大时间戳行没有订购选择和限制返回的行数为1?这似乎应该是可能的,但我想我的SQL阿福不及格。
解决方案
SELECT * from foo where timestamp = (select max(timestamp) from foo)
,或者,如果SQLite的坚持治疗子选择作为一组,
SELECT * from foo where timestamp in (select max(timestamp) from foo)
其他提示
有很多方法对皮肤一只猫。
如果您具有自动递增功能的标识列,会如果通过ID返回的最后一条记录,由于该列的索引,除非你想提出一个索引上导致更快的查询时间戳列。
SELECT * FROM TABLE ORDER BY ID DESC LIMIT 1
我想现在我已经回答了这个问题5倍,在过去的一周,但我太累了,找到一个链接到现在,这些权利之一,所以这里又是...
SELECT
*
FROM
table T1
LEFT OUTER JOIN table T2 ON
T2.timestamp > T1.timestamp
WHERE
T2.timestamp IS NULL
你基本上找没有其他行匹配晚于它的行。
请注意:由于在评论中指出,这种方法不会在这种情况执行为好。它通常会更好地工作(对于SQL Server至少)在您希望为每一位客户的最后一排的情况下(作为一个例子)。
<击>,你可以简单地做击>
<击> SELECT *,最大值(时间戳)FROM表击>
修改强> 作为聚合函数不能这样使用,以便它提供了错误。我猜 SquareCog 曾建议是最好的事情。
SELECT * FROM table WHERE timestamp = (select max(timestamp) from table)
不隶属于 StackOverflow