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

Posted

技术标签:

【中文标题】事实表中具有不同日期的两个维度【英文标题】:two dimensions with different dates in fact table 【发布时间】:2013-12-10 03:47:30 【问题描述】:

我正在尝试解决这个问题,但什么都想不出来。

我有 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_date 而不是 TEMP_REQUEST 表。现在,如果我想查询事实表以获取如下查询:the number of temp requests by week! 我不知道如何处理事实表的当前状态。

非常感谢任何帮助!

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

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

【问题讨论】:

为什么不用 temp_request 加入事实表,并在 temp_request 的日期放置您想要的任何类型的条件? 不确定我是否可以这样做。我的意思是说,如果想从中获取会话数,我可以使用 where 条件: where dw_time.time_id = dw_sessions_fact.time_id 但我不能对事实表中的 temprequest_id 使用类似的东西,因为 time_id 已经填充了日期仅来自 SESSIONS 表! 为什么不能在包含会话 time_id 的事实表中添加另一列? 我有 time_id,我有 session_id,我在事实表中也有 temprequest_id。 time_id 是根据 SESSION 维度中的 session_date 列插入的。 temprequest_id 也是 SESSION 维度中的一列,充当 TEMP_REQUEST 表的外键。但是 TEMP_REQUEST 表也有一个 request_date。而事实表中的 time_id 只对应 session_id 而不是 temprequest_id。看代码中的插入命令! TEMP_REQUEST 表有大约 87 个条目(即日期),SESSION 表有大约 357 个条目(即日期)我如何使事实表中的 time_id 以某种方式分别对应于这两者。目前只对应session_id,不对应temprequest_id。我不知道该怎么做,这就是我需要帮助的地方。 【参考方案1】:

您可以在事实表中拥有多个时间 ID。根据@ElectricLlam 的评论为 TRANSACTION 时间添加另一列

ALTER TABLE DW_SESSIONS_FACT ADD REQUEST_TIMEID int NULL

然后,保持当前获取 time_ids 的方法

SELECT time_id INTO v_timeid_transaction from dw_time
where session_date = c_rec.request_date;

我不确定为什么您的 time_dim 表在其日期/时间字段中明确引用了 SESSION。您的时间维度应该是独立的,以便任何日期字段都可以引用它。

总结:

表格:

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;

【讨论】:

以上是关于事实表中具有不同日期的两个维度的主要内容,如果未能解决你的问题,请参考以下文章

基于链接到维度表之一的事实表中的键添加新维度

事实和维度数据仓库 Datamart

DAX - 根据事实表中的最新数据运行日期在日期维度表中创建滚动的“过去 7 天内”TRUE/FALSE 列

在另一个事实表中使用退化维度

如何使用不同谷物的事实表对日期维度进行建模

将一个维度加入具有不同粒度的多个事实表