数据仓库事实表生成
Posted
技术标签:
【中文标题】数据仓库事实表生成【英文标题】:Datawharehouse Fact Table Geneate 【发布时间】:2016-02-08 10:19:04 【问题描述】:目前,我正在构建基于我的 ODS 表和维度表的事实表。 我的 ODS 表像
1.dateWiseData
sid_date
总印象数
2.设备(手机、PC等)
sid_date
device_id
设备名称
总印象数
3.AdvertiserData
sid_date
advertiser_id
广告商名称
总印象数
事实表
身份证
sid_date
设备ID
广告商ID
总印象数
在这里,我们面临将所有三个表数据连接到单个事实表中的问题。 在这种情况下,我们在每张桌子上都有三个不同的总印象数。但实际上表我们只是添加了单个总印象数。我们如何计算它然后加入。 我们尝试了不同的连接技术人员,但没有找到完美的解决方案。
请帮助我们处理此案
【问题讨论】:
您需要定义“单次总展示次数”。你什么意思?然后,这决定了如何转换您的数据。您应该发布到目前为止的一些尝试,并清楚地解释为什么它们不符合您的要求。到目前为止,您的解释还不清楚——您既没有解释业务需求,也没有解释技术尝试。 【参考方案1】:您是否正在尝试构建维度 (Kimball) 数据仓库?如果是这样,您可以进行一些更改。
(1) 你不需要 dateWiseData。
(2) 您不需要在设备上使用 total_impressions。
(3) 您不需要针对广告客户数据的 total_impressions。
我是否可以建议您的模型看起来更像这样:
calendar (id, cal_date, cal_year, cal_month, ... )
device (id, name)
advertiser (id, name)
impression (calendar_id, device_id, advertiser_id, impression_count)
这假设一个事实可以有多个印象。如果这不正确,那么您就有所谓的“无事实事实”,表格应如下所示:
impression (calendar_id, device_id, advertiser_id)
现在您可以运行查询,例如计算给定日期的设备总展示次数:
select device.name,count(*)
from impression
inner join device on device.id = device_id
inner join calendar on calendar.id = calendar_id
where calendar.cal_date = '2016-02-08'
group by device.name;
这符合您的要求吗?
编辑:回答问题,如下。
在这种情况下,您需要事实表的第一种形式:
impression (calendar_id, device_id, advertiser_id, impression_count)
您查找广告客户展示次数的查询如下所示:
select advertiser.name,sum(impression_count)
from impression
inner join advertiser on advertiser.id = advertiser_id
inner join calendar on calendar.id = calendar_id
where calendar.cal_date = '2016-02-08'
group by advertiser.name;
如果你试图在其他任何地方计算总数,你最终会陷入痛苦的世界。
【讨论】:
您好@Ron,谢谢您的回复实际上我们对广告客户、设备有不同的印象基础。我们没有得到计数。事实上,我们有以下列 Fact Table id sid_date devicesID AdvertisementrID total_impressions。因此,使用事实表管理总印象将非常复杂,我希望广告客户明智的印象(按广告客户 ID 分组)或如果我希望设备总印象也产生(按设备 ID 分组)。 我已更新答案以反映您的问题。这并不“复杂”,它是标准的维度建模。以上是关于数据仓库事实表生成的主要内容,如果未能解决你的问题,请参考以下文章