如何获得所有结果,除了基于时间戳的一行?

时间:2011-02-02 08:03:05

标签: sql

我有一个关于SQL的简单问题(?)。我之前已经遇到过这个问题,我总是解决它,但我正在寻找一个更优雅的解决方案,也许是一个更快的解决方案。

问题是我想要选择表中的所有行,除了时间戳值中具有最大值的行(在这种情况下,这是一个摘要行,但它没有被标记为这是任何方式,并且它不是重要的我的结果)。

我可以这样做:

select * from [table] t
where loggedat < (select max(loggedat) from [table] and somecolumn='somevalue')
and somecolumn='somevalue'

但是在使用大型表时,这似乎有点慢。有什么建议吗?

3 个答案:

答案 0 :(得分:1)

如果您不想更改数据库结构,那么您的查询(或使用<>而不是<稍有不同的查询)就可以了。

您可以向表中添加列IsSummary bit,并始终将最近的行标记为true(其他所有行都为false)。然后您的查询将更改为:

Select * from [table] where IsSummary = 0 and somecolumn = 'somevalue'

这会牺牲插入速度较慢的速度(因为插入也会触发IsSummary值的更新),以换取选择查询的更快速度。

答案 1 :(得分:0)

它可能不是您正在寻找的优雅的SQL查询,但在获取结果后,在Java,PHP等中执行它是微不足道的。为了使其尽可能简单,请使用ORDER BY timestamp DESC并丢弃第一行。

答案 2 :(得分:0)

如果只是你不介意一个小的(4字节)额外列,那么你可能会这样:

SELECT *
FROM (
  SELECT *, ROW_NUMBER() OVER (ORDER BY loggedat DESC) AS rownum
  FROM [table] t
  WHERE somecolumn = 'somevalue'
    /* and all the other filters you want */
) s
WHERE rownum > 1

如果你注意额外的列,你只需要在外部SELECT中明确列出必要的列。