заполнение сводной таблицы - PullRequest
0 голосов
/ 13 июля 2010

У меня есть вопрос

таблица назначения

str_week_day end_week_day  age_id usage_ratio eq_type
------------ ------------  ------ ----------- -------
11-Jul-10    17-Jul-10       1.00         0.5 RECEIVER
11-Jul-10    17-Jul-10       2.00         0.5 HUB
18-Jul-10    24-jul-10       1.00         0.5 RECEIVER
18-Jul-10    24-jul-10       2.00         0.5 HUB
.......
......
and so on 

таблица источника

Start_date End_Date     age_id  eq_type
---------- --------     ------  ------- 
13-Jul-10  30-Jul-10      1.00  RECEIVER
15-Jul-10  25-Jul-10      2.00  HUB

плохо дать образец

source_data

DIM_PANELIST_ID E E_SERIAL_NMBR DIM_PANEL_ID     AGE_ID BEGIN_DATE   END_DATE P_BEGIN_DATE INSERT_TS                                                           UPDATE_TS
--------------- - ------------- ------------ ---------- ---------- ---------- ------------ --------------------------------------------------------------------------- ----------------------------------------------------
              1 M        172241           12          2       1616       1742          977 13-JUL-10 09.07.35.000000 PM                                                13-JUL-10 09.07.35.000000 PM
              1 R        812890           12          2       1616       1742          977 13-JUL-10 09.07.35.000000 PM                                                13-JUL-10 09.07.35.000000 PM
              2 M        154918           12          3       1560       1639          894 13-JUL-10 09.07.35.000000 PM                                                13-JUL-10 09.07.35.000000 PM
              2 M        275351           12          3       1483       1560          894 13-JUL-10 09.07.35.000000 PM                                                13-JUL-10 09.07.35.000000 PM
              3 M        155758           12          3       1560       1639          894 13-JUL-10 09.07.35.000000 PM                                                13-JUL-10 09.07.35.000000 PM
              4 M        240087           12          4       1508       1557         1324 13-JUL-10 09.07.35.000000 PM                                                13-JUL-10 09.07.35.000000 PM
              4 M        151575           12          4       1557       1601         1324 13-JUL-10 09.07.35.000000 PM                                                13-JUL-10 09.07.35.000000 PM
              4 M        116520           12          4       1602                    1324 13-JUL-10 09.07.35.000000 PM                                                13-JUL-10 09.07.35.000000 PM
              5 M        158929           12          4       1576       1588          868 13-JUL-10 09.07.35.000000 PM                                                13-JUL-10 09.07.35.000000 PM
              6 R        812346           12          4       1621       1676         1112 13-JUL-10 09.07.35.000000 PM                                                13-JUL-10 09.07.35.000000 PM
              6 M        170735           12          4       1621       1676         1112 13-JUL-10 09.07.35.000000 PM                                                13-JUL-10 09.07.35.000000 PM
              7 M        279409           12          4       1662       1686          944 13-JUL-10 09.07.35.000000 PM                                                13-JUL-10 09.07.35.000000 PM
              7 M        272720           12          4       1508       1661          944 13-JUL-10 09.07.35.000000 PM                                                13-JUL-10 09.07.35.000000 PM
              8 M        194139           12          5       1712                    1155 13-JUL-10 09.07.35.000000 PM                                                13-JUL-10 09.07.35.000000 PM
              8 M        279839           12          5       1484       1511         1155 13-JUL-10 09.07.35.000000 PM                                                13-JUL-10 09.07.35.000000 PM
              8 R        319711           12          5       1512       1620         1155 13-JUL-10 09.07.35.000000 PM                                                13-JUL-10 09.07.35.000000 PM
              8 R        812067           12          5       1620                    1155 13-JUL-10 09.07.35.000000 PM                                                13-JUL-10 09.07.35.000000 PM
              8 M        274505           12          5       1512       1620         1155 13-JUL-10 09.07.35.000000 PM                                                13-JUL-10 09.07.35.000000 PM
              8 M        171353           12          5       1620       1709         1155 13-JUL-10 09.07.35.000000 PM                                                13-JUL-10 09.07.35.000000 PM
              9 M        173784           12          5       1617                    1315 13-JUL-10 09.07.35.000000 PM                                                13-JUL-10 09.07.35.000000 PM
              9 R        814566           12          5       1617                    1315 13-JUL-10 09.07.35.000000 PM                                                13-JUL-10 09.07.35.000000 PM
             10 M        154363           12          5       1557                    1324 13-JUL-10 09.07.35.000000 PM                                                13-JUL-10 09.07.35.000000 PM
             11 M        145473           12          5       1558                    1324 13-JUL-10 09.07.35.000000 PM                                                13-JUL-10 09.07.35.000000 PM
             11 R        322260           12          5       1558                    1324 13-JUL-10 09.07.35.000000 PM                                                13-JUL-10 09.07.35.000000 PM
             12 M        158807           12          5       1576       1588          868 13-JUL-10 09.07.35.000000 PM                                                13-JUL-10 

Ожидаемые_Таргет_данные

STR_WK_DAY  END_WK_DAY  EQ_TYPE USAGE_RATIO
4-Jan-09      10-Jan-09   R   0.5
4-Jan-09      10-Jan-09   M   0.5
11-Jan-09     17-Jan-09   M   1
18-Jan-09     24-Jan-09   M   1
18-Jan-09     24-Jan-09   M   1
18-Jan-09     24-Jan-09   M   1

данные в цели не точны, кроме даты

Я хочу заполнить цельтаблица, которую я не знаю, как ее заполнить. Я попробовал пару сценариев:

Mfrp1 таблица - исходная таблица

select (select count(*) 
         from mfrp1 
         where aid=a.aid )/(select count(*) 
                             from mfrp1) as ratio
       , a.aid as ageid
       , (case when a.m>a.r then 'M' else 'R'end) as eq_type
from  (select  aid
                , sum(case when eq_type='M'then 1 else 0 end) as "M",
                  sum(case when eq_type='R'then 1 else 0 end) as "R"            
      from mfrp1 group by aid) a;

Ответы [ 3 ]

0 голосов
/ 13 июля 2010

Рассматривали ли вы создание представления вместо таблицы? Оператор CREATE VIEW - это просто запрос, и тот же запрос, который вы использовали бы для заполнения таблицы, будет использоваться для определения представления. Представление не устареет.

0 голосов
/ 13 июля 2010

Как сказал @JonH, вам нужно использовать вставку для заполнения таблицы. Сделав ряд предположений, ваш запрос может выглядеть так:

insert into Target_Table
       (str_week_day, end_week_day, age_id, usage_ratio eq_type)
select str_week_day,
       week_start+6 as end_week_day
       a.aid as age_id,
       a.cnt/m.cnt as usage_ratio,
       (case when a.m>a.r then 'M' else 'R'end) as eq_type
from
      (select aid,
              sum(case when eq_type='M'then 1 else 0 end) as "M",
              sum(case when eq_type='R'then 1 else 0 end) as "R" ,
              count(*) as cnt,
              trunc(start_date,"D") as str_week_day
       from mfrp1 
       group by aid, 
                trunc(start_date,"D")) a,
      (select count(*) as cnt from mfrp1) m;

Однако, как сказал @Brian Hooper, вам будет намного лучше с видом. Как он упомянул, представление всегда будет соответствовать исходным данным, поскольку это просто хранимый запрос, который выполняется по этим данным по требованию. Поскольку к представлению обращаются точно так же, как к таблице, они в большинстве случаев неразличимы для пользователя (будь то человек или приложение).

create or replace view Target_Table as
select str_week_day,
       week_start+6 as end_week_day
       a.aid as age_id,
       a.cnt/m.cnt as usage_ratio,
       (case when a.m>a.r then 'M' else 'R'end) as eq_type
from
      (select aid,
              sum(case when eq_type='M'then 1 else 0 end) as "M",
              sum(case when eq_type='R'then 1 else 0 end) as "R" ,
              count(*) as cnt,
              trunc(start_date,"D") as str_week_day
       from mfrp1 
       group by aid, 
                trunc(start_date,"D")) a,
      (select count(*) as cnt from mfrp1) m;

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

0 голосов
/ 13 июля 2010

Для заполнения таблицы вам нужно вставить.

INSERT INTO TargetTable
  (
    str_week_day,
    end_week_day,
    age_id,
    eq_type
  )

SELECT
   start_date,
   end_date,
   age_id,
   eq_type
FROM
   SourceTable
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...