全面深入了解稀疏事实表

Posted

技术标签:

【中文标题】全面深入了解稀疏事实表【英文标题】:Get full drilldown of a sparce fact table 【发布时间】:2019-11-30 02:48:05 【问题描述】:

我有一个事务事实表和产品、时间和位置作为维度表。这个事实表是稀疏的,所以如果 1 月份没有披萨售出,那么事实表中就没有披萨的记录。

当我按未在结果中的 Pizza 的产品汇总结果进行钻取时。但我希望它有 0 个值作为 units_sold = 0。

一种解决方案是使用左外连接将产品表连接到事实表。然后我可以得到想要的结果。


但是当我使用另一个维度(例如位置或时间)进行切割时,结果中又缺少这些产品。

外连接为其他维度的外键提供空列,因此 WHERE 子句将再次删除它们。


我该如何解决这个问题? (我使用 ROLAP)

正如有些人回答的那样,使用连接条件是个好主意。但我需要更通用的解决方案。

例如,

表1

 person      birth year       death year

 a          1950               2006
 b          1952               2008
 c          1960               2007
 d          1953               1990

我想逐年统计出生于 1950 年至 1953 年并死于 2006 年至 2008 年的人数。

喜欢

birth = 1950   death = 2006   count = 1
birth = 1951   death = 2006   count = 0
...

我们能否通过适当地使用连接条件和 where 条件来处理这种情况。

【问题讨论】:

WHERE 条件移动到JOIN 条件中。 这能回答你的问题吗? SQL Left Join does not return all results 请提供样本数据和期望的结果。 感谢@Nick,这将起作用。但是我仍然想知道是否有一些可以在 OLAP 多维数据集中实现的通用解决方案。 例如,当我们有两个维度并且我们在每个维度中执行范围切割和向下钻取时。当事实表是稀疏的时,我们如何获得与多维数据集中的每个向下钻取单元格对应的所有结果。 【参考方案1】:

你想要LEFT JOIN,然后又想要LEFT JOIN。然后条件进入 on 子句。像这样的:

select . . .
from products p left join
     fact f
     on p.product_id = f.product_id left join
     timedim td
     on f.time_id = td.time_id and
        td.month = 'January'

【讨论】:

使用连接条件代替 where 条件是个好主意。不过我还是找到了更好的解决方案。

以上是关于全面深入了解稀疏事实表的主要内容,如果未能解决你的问题,请参考以下文章

数据结构实验报告之三元组顺序表存储的稀疏矩阵练习

numpy.ndarray稀疏矩阵到密集

C#数据结构(4) 稀疏矩阵与稀疏方阵

数据结构:线性表的使用原则以及链表的应用-稀疏矩阵的三元组表示

Bigtable中稀疏表的稀疏和目的是啥?

稀疏自编码器及事实上现——怎样搞基