【问题标题】:Match two tables based on minimum dates efficiently有效地根据最短日期匹配两个表
【发布时间】:2014-11-18 21:00:36
【问题描述】:

我有两张表,一张包含季度数据,一张包含每日数据。我想加入这两个表,以便在每日数据中的每一天,每天都会选择并返回该季度的季度数据。我正在使用 Postgres 9.3。

当前查询如下:

select 
  a.ID, 
  a.datadate, 
  b.*, 
  case when a.datadate = b.rdq then 1 else 0 end as VALID 
from proj_data a, proj_rat b
where a.id = b.id
and b.rdq = (select min(rdq) 
             from proj_rat c 
             where a.id = c.id and a.datadate >= c.rdq);

但它非常慢,我需要为数千个 ID 执行此操作。谁能提出更有效的解决方案?

【问题讨论】:

  • 我在 rdq 和 ID 上创建了索引,它从几分钟到几毫秒。我的错。我仍然很好奇是否有人有更有效的查询。

标签: sql postgresql select


【解决方案1】:

这消除了where 子句中对子查询的需要

select 
    ID, 
    a.datadate, 
    b.*, 
    (a.datadate = b.rdq)::integer as VALID 
from
    proj_data a
    inner join
    (
        select distinct on (id, rdq) *
        from project_rat
        order by id, rdq
    ) b using(id)
where a.datadate >= b.rdq;

【讨论】:

  • 那里有很多有用的语法。它速度很快,但它为我的测试 ID 返回 107205 行,而我期待 3393 行。这就是为什么我认为我需要 min(rdq) 子句,否则它也与过去的所有内容匹配。
  • @Michael 你用的是distinct on (id, rdq)的版本还是我快速编辑的distinct on (id)
  • @Clodoaldo Neto distinct on (id, rdq)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-06
  • 2021-06-23
  • 1970-01-01
  • 2019-11-12
  • 1970-01-01
  • 1970-01-01
  • 2017-09-03
相关资源
最近更新 更多