SQL应用笛卡尔积(Cartesian Product)的场景

引言

SQL笛卡尔积大家都不陌生,在数据库技术中算是基础的基础。但这么基础的逻辑,一样可以有一些很实用的应用,今天就罗列一些用不到的场景。

SQL笛卡尔积应用场景举例

场景1:商品日销售量汇总

场景描述:首先一个应用就是与日期相关的统计预测。比如在销售报表中常见的【商品日销售统计】,它要求统计每一个商品在每一天的销售量和销售额。这里的特别之处是即便某个商品在某一天没有销售,仍要显示一条该产品在这一天的记录,只是对应指标显示为0或空。这里的方案就是先将产品和日期先笛卡尔积,再跟销售数据表关联去统计。

 

场景2:单记录表(single record table)广播

场景描述:在对大表做一些查询计算时,可能用到若干个参数值,而这些参数又是基于其它一些维表或者逻辑计算所得。那么一个规避表关联和hardcode 的方式就是先将参数构造成一条记录中,比如“lastRefresh Date”,“YTDdays”,“isOpenId”...然后让这个表去cross join 整个大表,以达到将单条记录广播到整个大表每一行,并参与计算。

 

场景3:计算月累计MTD 或者年 YTD

场景描述:MTD 和 YTD 是 BI 或者报表中非常常见的应用,现在大多BI工具都可自动计算,而在数据库中也可以用开窗函数实现。但在一些低版本的数据库,或者某些限制情况下,我们只能应用基本的SQL。这个时候我们可以让业务表自关联,构造一个笛卡尔积,然后再应用我们的计算逻辑。当然数据量大时这样做是危险的,能怎么优化,这只能去具体问题具体分析了。

场景4:生成Junk Dimension(杂项维度表)

场景描述:Junk Dimension 是Kim Ball在维度建模里面引入的一个概念。本质上就是将一些小的维表,合并进一个大的宽的维度表。这样可以有效减小事实表的大小,并且让模型表易用一些。 那么生成整个Junk Dimension 就可以直接让小的维表笛卡尔积下。

总结

项目中用到笛卡尔积的地方还有很多,以上只是罗列工作中一些常见的。你还遇到过什么样的场景实用笛卡尔积,欢迎评论区讨论!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值