Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 事实表中具有不同日期的两个维度_Sql_Oracle_Plsql_Data Warehouse - Fatal编程技术网

Sql 事实表中具有不同日期的两个维度

Sql 事实表中具有不同日期的两个维度,sql,oracle,plsql,data-warehouse,Sql,Oracle,Plsql,Data Warehouse,我想避开这件事,但什么都想不出来 我有5个维度,其中两个有不同的日期。具体来说, TEMP_REQUEST ------------ temprequest_id localcouncil_id request_date 另一个表格是: SESSION -------- session_id temprequest_id session_date status . . 现在我使用如下光标填充事实: seq NUMBER; v_timeid NUMBER; Cursor c_fac

我想避开这件事,但什么都想不出来

我有5个维度,其中两个有不同的日期。具体来说,

TEMP_REQUEST
------------
temprequest_id
localcouncil_id
request_date    
另一个表格是:

SESSION
--------
session_id
temprequest_id
session_date
status
.
.
现在我使用如下光标填充事实:

seq NUMBER;
 v_timeid NUMBER;

Cursor c_factable is
select  

  dw_localcouncil2.localcouncil_id,
  dw_session2.session_id,
  dw_temp2.temp_id,
  dw_temprequest2.temprequest_id,
  dw_typeoftempcover2.type_of_cover_id,
  dw_session2.session_date
from  DW_LOCALCOUNCIL2, DW_SESSION2, DW_TEMP2, DW_TEMPREQUEST2, DW_TYPEOFTEMPCOVER2
where dw_temprequest2.localcouncil_id = dw_localcouncil2.localcouncil_id AND
dw_session2.temprequest_id = dw_temprequest2.temprequest_id AND
dw_session2.temp_id = dw_temp2.temp_id AND
dw_session2.type_of_cover_id = dw_typeoftempcover2.type_of_cover_id;
begin
dbms_output.put_line('it is running!');
for c_rec in c_factable loop

SELECT time_id INTO v_timeid from dw_time
where session_date = c_rec.session_date;


insert into DW_SESSIONS_FACT values(v_timeid, c_rec.localcouncil_id, c_rec.session_id, c_rec.temp_id, c_rec.temprequest_id, c_rec.type_of_cover_id);

end loop;
我的问题是事实表中的time_id字段对应于session表中的session_日期,而不是TEMP_请求表。现在,如果我想查询事实表以获得如下查询:
每周的临时请求数我不知道如何在事实表的当前状态下进行此操作

非常感谢您的帮助

时间维度已提前生成和填充。包括从开始日期到结束日期之间的所有日期。它包含以下列:

TIME_DIM
---------
time_id
session_date
t_day,
t_month,
t_year

事实表中允许有多个时间id。根据@electrillam的评论,为事务时间添加另一列

ALTER TABLE DW_SESSIONS_FACT ADD REQUEST_TIMEID int NULL
然后,保持当前获取时间ID的方法

SELECT time_id INTO v_timeid_transaction from dw_time
where session_date = c_rec.request_date;
我不知道为什么您的time_dim表在其日期/时间字段中有一个对会话的显式引用。您的时间维度应该是独立的,以便可以被任何日期字段引用

总之:

表:

TIME_DIM
---------
time_id
d_date   --(date/timestamp datatype)
t_day
t_month
t_year

TEMP_REQUEST
------------
temprequest_id
localcouncil_id
request_date  

SESSION
--------
session_id
temprequest_id
session_date
status

DW_SESSIONS_FACT
----------------
session_timeid, 
request_timeid,
localcouncil_id, 
session_id, 
temp_id, 
temprequest_id, 
type_of_cover_id
以及您的etl过程:

seq NUMBER;
v_timeid_session NUMBER;
v_timeid_request NUMBER;

Cursor c_factable is
select  

  dw_localcouncil2.localcouncil_id,
  dw_session2.session_id,
  dw_temp2.temp_id,
  dw_temprequest2.temprequest_id,
  dw_typeoftempcover2.type_of_cover_id,
  dw_session2.session_date,
  dw_temprequest2.request_date
from  DW_LOCALCOUNCIL2, DW_SESSION2, DW_TEMP2, DW_TEMPREQUEST2, DW_TYPEOFTEMPCOVER2
where dw_temprequest2.localcouncil_id = dw_localcouncil2.localcouncil_id AND
dw_session2.temprequest_id = dw_temprequest2.temprequest_id AND
dw_session2.temp_id = dw_temp2.temp_id AND
dw_session2.type_of_cover_id = dw_typeoftempcover2.type_of_cover_id;
begin
dbms_output.put_line('it is running!');
for c_rec in c_factable loop

--You can do these joins directly in your c_factable query, it would be much faster
--and you could remove the need for a cursor..
SELECT time_id INTO v_timeid_session from dw_time
where d_date = c_rec.session_date;

SELECT time_id INTO v_timeid_request from dw_time
where d_date = c_rec.request_date;


insert into DW_SESSIONS_FACT values(v_timeid_session, v_timeid_request , c_rec.localcouncil_id, c_rec.session_id, c_rec.temp_id, c_rec.temprequest_id, c_rec.type_of_cover_id);

end loop;

为什么不将事实表与temp_请求连接起来,并在temp_请求的日期放置任何类型的条件呢?不确定我是否可以这样做。我的意思是说,如果想从中获取会话数,我可以使用where条件:where dw_time.time_id=dw_sessions\u fact.time_id,但我不能在事实表中使用类似的temprequest\u id,因为time_id已经填充了来自会话表的日期!为什么不能向包含会话时间id的事实表中添加另一列?事实表中有时间id、会话id和临时请求id。时间id是基于会话维度中的会话日期列插入的。temprequest_id也是会话维度中的一列,充当TEMP_请求表的外键。但是临时请求表也有一个请求日期。事实表中的time_id只对应于session_id,而不是temprequest_id。请看代码中的insert命令!TEMP_请求表有大约87个条目(即日期),SESSION表有大约357个条目(即日期)。如何使事实表中的time_id分别对应于这两个条目。目前,它只对应于会话id,而不是临时请求id。我不知道如何做,这就是我需要帮助的地方。