Sql 选择最大(日期)条件下的给定数据

Sql 选择最大(日期)条件下的给定数据,sql,vertica,Sql,Vertica,嗨,我有一个简单的问题:从date>=maxdate-7的表中选择数据 有很多方法可以做到这一点:假设桌子是一个 例如:右外部联接在A.date>=B.date-7上从B选择maxdate 但是如果A表非常大,我不想在这里创建一个巨大的连接,查询将花费很长时间。还有其他方法吗?不要担心加入。基本上,您需要扫描表两次,一次扫描获取最大日期,一次扫描获取原始行 连接本身是到一行的,并且连接到一行的开销很小 如果您知道您每天只有一条记录,您可以使用limit。但事实并非如此。如果您真的关心大型表的性能

嗨,我有一个简单的问题:从date>=maxdate-7的表中选择数据

有很多方法可以做到这一点:假设桌子是一个 例如:右外部联接在A.date>=B.date-7上从B选择maxdate

但是如果A表非常大,我不想在这里创建一个巨大的连接,查询将花费很长时间。还有其他方法吗?

不要担心加入。基本上,您需要扫描表两次,一次扫描获取最大日期,一次扫描获取原始行

连接本身是到一行的,并且连接到一行的开销很小


如果您知道您每天只有一条记录,您可以使用limit。但事实并非如此。

如果您真的关心大型表的性能,并且这是一个经常运行的查询,我会将max date添加到审计表中,该表会在每次加载时更新。然后在主表中的日期上进行分区,以便审计表中的maxdate和maxdate-7之间的映射是有效的

我不明白您为什么在这个场景中使用连接。为什么不使用子查询呢

Select * from A where A.date >= (select max(date) from A);

我假设查询计划将首先计算子对象,然后使用该结果对A进行筛选。此外,如果您为此表创建一个按日期排序的投影,这将有助于提高性能。

您需要从表A中获得什么才能加入它?假设每一列。但这并不重要。这只是一个一般性问题。那么除了查询转到表a并扫描它以使查询与最大日期匹配之外,没有其他方法。有没有任何方法可以直接在where子句中使用第一次扫描的最大日期?@yabchexu。怎样当它读取第一行时,它不知道最大值是多少。似乎必须使用join,但不确定使用的是哪一个db。但对于某些数据库,子查询中的聚合函数不能引用外部查询中的列。