postgresql - 有效地找到 a < (max(a) for a given b) 的行

标签 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) 的输出对于特定的 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/

相关文章:

django - 让 Django 和 PostgreSQL 工作

postgresql - 为什么我无法停止 RDS 实例?

database - 如何在 postgres 中添加有关警告消息的信息

php - 关闭ajax调用的连接

SQL 查找 10 月促销商店销售额最高的一天

perl - 来自 Perl 的区域设置警告会停止 Postgres 配置

postgresql - 无法从 Kubernetes 集群外部连接到 postgres

postgresql - 列是 bool 类型,但表达式是文本类型提示 : You will need to rewrite or cast the expression

sql - Rails 查询同一字段上的多个条件

sql - PostgreSQL LIKE 子句中的正则表达式