Сбор данных истории из нескольких таблиц атрибутов - PullRequest
0 голосов
/ 17 мая 2019

У меня ужасно разработанный набор таблиц базы данных, которые содержат данные для судов.Атрибуты судна разделены на их собственные таблицы (название судна, длина, мощность и т. Д.).Когда судно обновляется, мы вставляем новую запись в соответствующую таблицу атрибутов с датой вступления в силу, чтобы мы могли вести историю.

Мне нужно перенести эти данные в плоский объект, который показывает, как судно выглядит в истории.Таким образом, если имя и длина были отредактированы в один и тот же день, то для этого дня будет только одна запись.Пожалуйста, обратитесь к следующему, чтобы лучше объяснить существующие данные и желаемые результаты.

Существующие таблицы БД

Vessel  
|---------------------|------------------|------------------|  
|      vessel_id      |        CG#       |   Modified_Date  |  
|---------------------|------------------|------------------|  
|          1          |        123       |     01/01/2000   |  
|---------------------|------------------|------------------|  

Vessel_Name  
|---------------------|------------------|------------------|  
|      vessel_id      |      Name        |   Modified_Date  |  
|---------------------|------------------|------------------|  
|          1          |   Sea Queen      |     01/01/2000   |  
|---------------------|------------------|------------------|  
|          1          |   Sea King       |     01/01/2001   |  
|---------------------|------------------|------------------|  
|          1          |   Sea Goddess    |     03/01/2005   |  
|---------------------|------------------|------------------|  

Vessel_Horsepower  
|---------------------|------------------|------------------|  
|      vessel_id      |      HP          |   Modified_Date  |  
|---------------------|------------------|------------------|  
|          1          |       50         |     02/01/2000   |  
|---------------------|------------------|------------------|  
|          1          |       75         |     01/01/2003   |  
|---------------------|------------------|------------------|  
|          1          |      115         |     03/01/2005   |  
|---------------------|------------------|------------------|  

Желаемые результаты

Vessel_History  
|------------|------------|------------|------------|----------------|  
| vessel_id  |     CG#    |    name    |     HP     | effective_Date |  
|------------|------------|------------|------------|----------------|  
|     1      |     123    | Sea Queen  |    NULL    |   1/1/2000     |  
|------------|------------|------------|------------|----------------|  
|     1      |     123    | Sea Queen  |     50     |   2/1/2000     |  
|------------|------------|------------|------------|----------------|  
|     1      |     123    | Sea King   |     50     |   1/1/2001     |  
|------------|------------|------------|------------|----------------|  
|     1      |     123    | Sea King   |     75     |   1/1/2003     |  
|------------|------------|------------|------------|----------------|  
|     1      |     123    |Sea Goddess |     115    |   3/1/2005     |  
|------------|------------|------------|------------|----------------|  

Я унаследовал эту базу данных и не могу сейчас вносить изменения в ее структуру.

1 Ответ

0 голосов
/ 17 мая 2019
-- Your Test Data
with vessel(id, cg, modified_date) as
 (select 1, 123, to_date('01012000', 'DDMMYYYY') from dual),
vessel_name(id, name, modified_date) as
 (select 1, 'Sea Queen', to_date('01012000', 'DDMMYYYY')
    from dual
  union all
  select 1, 'Sea King', to_date('01012001', 'DDMMYYYY')
    from dual
  union all
  select 1, 'Sea Goodess', to_date('03012005', 'DDMMYYYY')
    from dual),
vessel_horsepower(id, hp, modified_date) as
 (select 1, 50, to_date('02012000', 'DDMMYYYY')
    from dual
  union all
  select 1, 75, to_date('01012003', 'DDMMYYYY')
    from dual
  union all
  select 1, 110, to_date('03012005', 'DDMMYYYY')
    from dual)

-- Select:
select m.id,
       -- determine value of table "vessel" for current id, modified_date 
       (select cg
          from vessel n
         where n.id = m.id
           and n.modified_date =
               (select max(nn.modified_date)
                  from vessel nn
                 where nn.id = n.id
                   and nn.modified_date <= m.modified_date)),
       -- determine value of table "vessel_name" for current id, modified_date 
       (select name
          from vessel_name n
         where n.id = m.id
           and n.modified_date =
               (select max(nn.modified_date)
                  from vessel_name nn
                 where nn.id = n.id
                   and nn.modified_date <= m.modified_date)),
       -- determine value of table "vessel_horsepower" for current id, modified_date 
       (select hp
          from vessel_horsepower n
         where n.id = m.id
           and n.modified_date =
               (select max(nn.modified_date)
                  from vessel_horsepower nn
                 where nn.id = n.id
                   and nn.modified_date <= m.modified_date)),
       m.modified_date
  from -- collect all modified_dates of an id:
        (select v.id, v.modified_date
           from vessel v
         union
         select v.id, v.modified_date
           from vessel_name v
         union
         select v.id, v.modified_date
           from vessel_horsepower v) m;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...