事实表中具有不同日期的两个维度
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;
【讨论】:
以上是关于事实表中具有不同日期的两个维度的主要内容,如果未能解决你的问题,请参考以下文章