填充每小时存储计数的事实表时,是否应包含0计数记录?

时间:2016-02-29 02:47:18

标签: sql-server data-warehouse

我有一个存储每个通话记录的表。我试图将其ETL转换为每小时聚合日志的事实表。

Fact_CallLog
===============
dim_date_id(PK)
dim_time_id(PK)
call_type(PK)
call_result(PK)
call_count

我写了这个查询来填充事实表。

SELECT log_dim.dim_date_id
      ,log_dim.dim_time_id
      ,log_dim.call_type
      ,log_dim.call_result
      ,COUNT(*) call_count
FROM [DW_Source_CTI].[dbo].[OLD_cti_call_log] log
LEFT JOIN (
      --categorize each call log with date, time, call type, call result
) log_dim ON log.cid = log_dim.cid
WHERE ~~~ --exclude faulty call logs
GROUP BY log_dim.dim_date_id
        ,log_dim.dim_time_id
        ,log_dim.call_type
        ,log_dim.call_result

问题是,此查询无法在没有呼叫时填充记录。例如,如果某段时间的通话记录如下,

12AM  3 calls
1AM   0 call
2AM   1 call

然后{1}}上不会填充1AM的记录。

我的问题是,我应该使用Fact_CallLog插入这些未填充的记录吗?或者不是?

1 个答案:

答案 0 :(得分:0)

如果你没有它们,可能没有必要把它们放在桌子上。但是,如果你想要/需要它们,那么运行如下的查询:

SELECT . . .
FROM log_dim LEFT JOIN
     [DW_Source_CTI].[dbo].[OLD_cti_call_log] log
     ON log.cid = log_dim.cid AND
         ~~~ --exclude faulty call logs
. . .

即,从log_dim的{​​{1}}开始,然后将LEFT JOIN条件移至WHERE子句。