有效地找到一个< (给定b的最大值(a))

时间:2014-05-15 04:36:51

标签: postgresql

我的表格结构如下:

a | b
2014-04-12| 3
2014-03-12| 3
2014-02-12| 3
2014-05-12| 4
2014-03-12| 4
2014-04-12| 4

我需要输出a小于特定max(a)的{​​{1}},a小于b

到目前为止,我所做的是在now() a < now()

的情况下进行自我加入

并且输出正确但查询的成本非常高,因为我的表中的行数非常大。有没有其他方法可以做到这一点。

我的查询是:

table.a < max(table1.b)

1 个答案:

答案 0 :(得分:4)

我认为这应该比自连接更快,因为只需要对表进行一次扫描:

select a,b
from (
  select a, 
         b, 
         max(a) over (partition by b) as max_a
  from the_table
  where a < now()
)
where a < max_a;

如果条件a < now()过滤掉许多行,则(a,b)上的索引会有所帮助。如果仍然留下很多行,(b,a)上的索引可能是加速找到给定的最大值的更好选择。但只有真实数据的执行计划才会显示