在 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上选择行/部分?