在 Max(date) 上选择给定条件的数据

Posted

技术标签:

【中文标题】在 Max(date) 上选择给定条件的数据【英文标题】:select data given condition on Max(date) 【发布时间】:2017-09-12 21:29:17 【问题描述】:

您好,我有一个简单的问题:从 date >= max(date) - 7 的表中选择数据。

有很多方法可以做到:(假设桌子是A) 例如:A 右外连接 (select max(date) from A) B on A.date >= B.date -7

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

【问题讨论】:

你需要从表 A 中加入什么? 假设每一列。但这没关系。只是一个一般性问题。 那么除了查询到表A并扫描它以匹配您的查询与MAX DATE之外别无他法。 【参考方案1】:

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

join 本身是单行,加入单行的开销很小。

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

【讨论】:

有什么办法可以直接在 where 子句中使用第一次扫描的最大日期? @yabchexu 。 . .如何?它在读取第一行时不知道最大值是多少。 看来得用join【参考方案2】:

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

【讨论】:

【参考方案3】:

我不明白您为什么在这种情况下使用join。为什么不使用子查询?

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

我假设查询计划将首先评估 subwuery,然后使用该结果过滤 A。此外,如果您为此表创建一个按日期排序的投影,这应该有助于提高性能。

【讨论】:

不确定您使用的是哪个数据库。但是对于某些数据库,子查询中的聚合函数不能引用列外部查询。

以上是关于在 Max(date) 上选择给定条件的数据的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 上选择退出 UISceneDelegate/SwiftUI

在单元格标签等于给定字符串的collectionView或TableView上选择行/部分?

PostgreSQL 查询基于连接条件和 max(date) 获取属性

如何在数据基础上选择分区名称

根据datepicker上选择的日期禁用整周

在多个数据库上选择相同查询并将它们联合的规范方法是啥?