我被要求在一个固定的时间点(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年的第二类,然后在2019年1月1日之后,它变成了第一类。
为了使它变得更复杂,我需要对几个数据进行处理,但是如果我能够正确地理解如何做到这一点,那么我很乐意将它转换成其他数据。
任何指点都将不胜感激!
发布于 2019-02-19 16:53:19
我通常这样写
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)的东西
编辑:如果您尝试在第一个point_in_time之前使用start_date运行此查询,则不会得到任何结果。这对我来说似乎很正常,但也许你想选择“第一个尚未过期的结果”,如下所示:
select assetClass
from history_table h
where (:point_in_time < endDate
or endDate is null)
order by startDate asc
fetch first 1 row onlyhttps://stackoverflow.com/questions/54770614
复制相似问题