我有一个关于SQL的简单问题(?)。我之前已经遇到过这个问题,我总是解决它,但我正在寻找一个更优雅的解决方案,也许是一个更快的解决方案。
问题是我想要选择表中的所有行,除了时间戳值中具有最大值的行(在这种情况下,这是一个摘要行,但它没有被标记为这是任何方式,并且它不是重要的我的结果)。
我可以这样做:
select * from [table] t
where loggedat < (select max(loggedat) from [table] and somecolumn='somevalue')
and somecolumn='somevalue'
但是在使用大型表时,这似乎有点慢。有什么建议吗?
答案 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中明确列出必要的列。