【问题标题】:Group queries with restriction on max/last value限制最大/最后值的分组查询
【发布时间】:2020-08-11 10:40:43
【问题描述】:

我有一个包含这些列的表格“元素”:

  • id(主键)
  • ref_id(对另一个表的引用)
  • 时间(添加行的时间)
  • value(给定 ref_id 在给定时间的值)

我需要获取每个 ref_id 的最后一个值和时间。

目前我为 a 中的每个 ref_id 查询谁返回正确的结果:

SELECT time, value
FROM element
WHERE ref_id = <ID>
 AND time = (SELECT max(time) FROM element WHERE ref_id = <ID>)

但是,执行多个查询需要很长时间(查询大约需要 1 秒)。我正在寻找对所有 ref_id 进行唯一查询以尝试加快整体时间。

有可能吗?

谢谢,

【问题讨论】:

  • 你能打印一下这个查询的解释计划吗?有多种可能的解决方案,从添加索引到在每个元素与其最大值之间建立连接,以及 - 添加 max 的分析函数可能是一个有效的解决方案:oracle-base.com/articles/misc/min-and-max-analytic-functions
  • 您好,感谢您帮助我。我添加了一个完成这项工作的索引。

标签: sql


【解决方案1】:

使用相关子查询:

SELECT time, value
FROM element e
WHERE e.time = (SELECT MAX(e2.time) FROM element e2 WHERE e2.ref_id = e.ref_id);

大多数数据库都可以为此利用索引:element(ref_id, time desc)

【讨论】:

  • 您好,首先感谢您的回答。我已经尝试过您的解决方案,但是,此查询花费的时间比所有查询的总和还要多。每个单独的查询大约需要 1 秒。使用 13 ref_id,我在 3 m 后停止了此查询。然而,索引大大加快了查询的速度,从大约 1 秒到 50 毫秒,这对我的需要来说很好。非常感谢!
猜你喜欢
  • 2016-03-27
  • 2015-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-20
  • 2019-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多