如何编写 SQL 查询数据仓库事实表

Posted

技术标签:

【中文标题】如何编写 SQL 查询数据仓库事实表【英文标题】:How to write SQL to query a data warehouse fact table 【发布时间】:2014-02-02 04:16:56 【问题描述】:

在线卖家的数据库模型:

为了创建数据仓库,我按照http://bit.ly/1bOuOXQ 对表进行了展平

事实表中的注释数据变得重复(买家在他们的订单中购买了两件商品。)

为了得到所有收入的总和,我通常会这样写sql:

从 OrderFact 中选择 sum(OrderTotal)

该 sql 可以在原始 OLTP 表上正常工作,但现在我正在查询一个具有非规范化数据的 OLAP 数据仓库,现在这种类型的 sql 将产生不正确的结果。

总收入查询应返回 $152.60。

如何修复 sql 以正确查询事实表?

【问题讨论】:

【参考方案1】:

如果你不能得到像总和或订单这样基本的东西,那么你的事实表设计就很糟糕。您所谓的“OrderFact”实际上是“LineItemFact”。如果它是“订单事实”,那么给定的订单只会在一行上。

如果这被设计为 LineItemFact,那么税收将在单独的行中,您可以这样做:

select sum(LineItemTotal)
from OrderFact

如果没有这个,你可以有一个“LineItemNumber 来枚举每个订单的行。然后你可以这样做:

select sum(OrderTotal)
from OrderFact
where LineItemNumber = 1;

使用您的结构,您可以:

select sum(OrderTotal)
from (select OrderId, max(OrderTotal) as OrderTotal
      from OrderFact
      group by OrderId
     ) o

【讨论】:

以上是关于如何编写 SQL 查询数据仓库事实表的主要内容,如果未能解决你的问题,请参考以下文章

数据仓库 - 如何使用 R 和/或 SQL 创建一个与所有维度相交的事实表

hive建立数据仓库 事实表的外键和维度表主键怎么关联 啥命令

数据仓库星型模式的维度表和事实表中的数据如何?

事实表的数据仓库设计

数据仓库设计:如何设计交货日期变化的事实和维度表

数据仓库事实表问题