Oracle历史报告-某个时间点的行

时间:2019-02-19 16:14:45

标签: oracle reporting temporal

我被要求在固定的时间点(2019年1月1日)运行一份关于我们资产状态的报告。

写入此数据库的方式是,资产拥有自己的带有当前信息的表,然后对于各种数据位,该信息也有变化的历史记录,每一位都存储有自己的“历史记录”表,并带有一个开始和结束日期。因此,例如,信息类别之一是资产类别-资产表将具有一个包含当前资产类别的字段,然后,如果该类别在过去发生了变化,那么asset_history表中将有行,其中包含开始和结束日期。像...

AssetID AssetClass StartDate EndDate
------- ---------- --------- -------
      1          1 12-12-87  23-04-90
      1          5 23-04-90  01-02-00
      1          2 01-02-00  27-01-19
      1          1 27-01-19

因此,此资产几次更改了类,但我需要为每项资产编写一些内容以进行检查,并确定截至1月1日为止哪个类是活动类。对于本示例,这将是第二个-从2000年的最后一行更改为2类,然后在2019年1月1日之后变为1类。

为了使其更复杂,我将需要几位数据,但是如果我能正确地做到这一点,那么我很乐意将其转换为其他数据。

任何指针将不胜感激!

1 个答案:

答案 0 :(得分:1)

我通常这样写<​​/ p>

select assetClass
from history_table h
 where :point_in_time >= startDate
   and (:point_in_time < endDate
        or endDate is null)

(假设这些列实际上是date类型,而不是varchar2

between似乎总是很吸引人,但是它同时包含两个端点,因此您必须编写类似:point_in_time between startDate and (endDate - interval '1' second)

的东西。

编辑:如果您尝试在第一个开始日期之前的某个时间点运行此查询,则不会获得任何结果。这对我来说似乎很正常,但是也许您想选择“尚未过期的第一个结果”,就像这样:

select assetClass
from history_table h
 where (:point_in_time < endDate
        or endDate is null)
order by startDate asc
fetch first 1 row only