【问题标题】:ORACLE Query to find value in other table based on datesORACLE查询根据日期在其他表中查找值
【发布时间】:2018-11-03 12:52:22
【问题描述】:

我有两个表,表 A 有一个 ID 和一个事件日期,表 B 有一个 ID、一个描述和一个事件日期。 并非表 A 中的所有 ID 都出现在表 B 中,并且某些 ID 在表 B 中出现多次,每个事件的描述都不同。 表 B 中的描述是一个可以随时间变化的属性,表 B 中的事件日期是给定 ID 的描述从其默认值(保存在另一个表中)更改为新值的日期。 我想在表 B 中找到与表 A 中的事件日期匹配的描述,例如

Table Sample Data

A1234 将返回 Green,A4567 将返回 Null

我无法在此处创建表,因此我需要能够通过查询来创建。

【问题讨论】:

  • 您能告诉我们您的查询吗?你做了什么得到结果?

标签: oracle date range between


【解决方案1】:

此查询将选择事件之前的最后一个描述:

SELECT * FROM (
  SELECT tabA.id, tabA.event_date, tabB.description,
    ROW_NUMBER() OVER(PARTITION BY tabB.id ORDER BY tabB.event_date DESC) rn
  FROM Table_A tabA 
  LEFT JOIN Table_B tabB ON tabA.id = tabB.id AND tabB.event_date <= tabA.event_date
) WHERE rn = 1

【讨论】:

  • 感谢您的建议和下面的 Aleksej - 我认为这两个都在正确的领域,但他们没有给我预期的结果 - 我想我需要再思考一下当我弄清楚时会回复(使这些建议起作用或其他)
【解决方案2】:

如果我能很好地理解您的需求,这可能是一种方式:

select a.id, description
from tableA A
        left join 
         (select id,
                 description,
                 event_date from_date,
                 lead(event_date) over (partition by id order by event_date) -1 as to_date
          from tableB
         ) B
         on (A.id = B.id and a.event_date between b.from_date and b.to_date)

这里的想法是为tableB 中的每一行评估该行及其描述有效的日期范围;鉴于此,一个简单的连接应该可以完成这项工作。

【讨论】:

    【解决方案3】:

    您可以像这样离开连接表:

    select a.ID , b1.DESCRIPTION 
    from TABLE_A a
    left join TABLE_B b1 on a.ID = b1.id and a.EVENT_DATE > b1.EVENT_DATE
    left join TABLE_B b2 on a.ID = b2.id and b1.EVENT_DATE < b2.EVENT_DATE and a.EVENT_DATE > b2.EVENT_DATE
    where b1.id is null or b2.EVENT_DATE is null;
    

    【讨论】:

    • 谢谢 - 对问题格式感到抱歉,样本表在编辑模式下看起来很好,但在发布时出现乱码...我已将其替换为似乎没有显示的图片?无论如何,我不能对日期进行简单的连接,因为表 B 中的日期是描述更改的日期,我需要在表 A 中获取事件的日期并找到表 B 中的当前描述,但所有表 B 都有是更改的日期
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-28
    • 1970-01-01
    • 2010-09-12
    相关资源
    最近更新 更多