我的表结构如下:
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)
的输出对于特定的 b
a 也小于 now()
.
到目前为止,我所做的是在 b use 上进行 self 连接 a < now()
有table.a < max(table1.b)
输出是正确的,但查询成本非常高,因为我的表中的行数非常大。有没有其他方法可以做到这一点。
我的查询是:
select a1.a, a1.b
from tab a1
JOIN tab b1
on a1.b=b1.b
where a1.a < now()
group by a1.a, a1.b
having a1.a < max(b1.a);
最佳答案
我认为这应该比自连接更快,因为只需要对表进行一次扫描:
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)
可能是加快找到给定最大值的更好选择。但只有针对您的真实数据的执行计划才能表明这一点
关于postgresql - 有效地找到 a < (max(a) for a given b) 的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23669347/