我被要求在固定的时间点(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类。
为了使其更复杂,我将需要几位数据,但是如果我能正确地做到这一点,那么我很乐意将其转换为其他数据。
任何指针将不胜感激!
答案 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