【问题标题】:select data given condition on Max(date)在 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之外别无他法。

标签: sql vertica


【解决方案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。此外,如果您为此表创建一个按日期排序的投影,这应该有助于提高性能。

    【讨论】:

    • 不确定您使用的是哪个数据库。但是对于某些数据库,子查询中的聚合函数不能引用列外部查询。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    • 2022-12-05
    • 2017-11-24
    • 2013-06-25
    • 1970-01-01
    • 2011-10-30
    • 2018-02-16
    相关资源
    最近更新 更多