代码之家  ›  专栏  ›  技术社区  ›  Kyle Cronin

SQLite中WHERE子句中的聚合函数

  •  10
  • Kyle Cronin  · 技术社区  · 17 年前

    简单地说,我有一个表,其中包括一列时间戳。我希望获得具有最新(即最大值)时间戳的行。目前我正在这样做:

    SELECT * FROM table ORDER BY timestamp DESC LIMIT 1
    

    但我更愿意这样做:

    SELECT * FROM table WHERE timestamp=max(timestamp)
    

    SQL error: misuse of aggregate function max()
    

    这个 documentation

    聚合函数只能在SELECT语句中使用。

    我的问题是:是否可以编写一个查询来获取具有最大时间戳的行,而无需对select进行排序并将返回的行数限制为1?这似乎应该是可能的,但我想我的SQL fu没有达到标准。

    4 回复  |  直到 17 年前
        1
  •  17
  •   SquareCog    17 年前
    SELECT * from foo where timestamp = (select max(timestamp) from foo)
    

    SELECT * from foo where timestamp in (select max(timestamp) from foo)
    
        2
  •  4
  •   Andro Selva Anand Wadhwani    13 年前

    给猫剥皮有很多种方法。

    如果您有一个具有自动递增功能的标识列,则由于该列的索引,如果您按ID返回最后一条记录,则会产生更快的查询,当然,除非您希望在时间戳列上放置索引。

    SELECT * FROM TABLE ORDER BY ID DESC LIMIT 1
    
        3
  •  1
  •   Tom H zenazn    17 年前

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

    您基本上是在查找没有其他行匹配的行,该行比它晚。

    注:正如评论中所指出的,这种方法在这种情况下不会表现得很好。在希望每个客户都有最后一行的情况下(例如),它通常会工作得更好(至少对于SQL Server)。

        4
  •  1
  •   Community Mohan Dere    9 年前

    从表中选择*,最大值(时间戳)

    编辑: SquareCog

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