Историческая отчетность Oracle - что было в данный момент - PullRequest
0 голосов
/ 19 февраля 2019

Меня попросили составить отчет о состоянии наших активов в фиксированный момент времени (1 января 2019 г.).

Способ написания этой базы данных состоит в том, что у актива есть собственная таблицас текущей информацией, а затем для различных битов данных также существует история изменения этой информации, каждый бит хранится в своей собственной таблице «истории» с начальной и конечной датами.Так, например, один из битов информации - это класс активов - таблица активов будет иметь поле, содержащее текущий класс активов, а затем, если этот класс изменился в прошлом, в таблице 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 января. Для этого примера это будет вторая строка из последней строки, поскольку она перешла в класс 2 в 2000 году, а затем после 1 января 2019 года она станет классом 1.

И чтобы сделать его более сложным, я сделаюМне нужно это для нескольких бит данных, но если я смогу понять, как это сделать правильно, тогда я с удовольствием переведу это на другие данные.

Любые указатели будут очень благодарны!

1 Ответ

0 голосов
/ 19 февраля 2019

Я обычно пишу это как

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)

РЕДАКТИРОВАТЬ: Если вы попытаетесь выполнить этот запрос с точкой_in_time до вашей первой начальной_даты , вы не получите никакихРезультаты.Это кажется мне нормальным, но, возможно, вместо этого вы хотите выбрать «первый результат, который еще не истек», например:

select assetClass
from history_table h
 where (:point_in_time < endDate
        or endDate is null)
order by startDate asc
fetch first 1 row only
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...