天天看点

PostgreSQL Oracle 兼容性之 - Partition By Outer Join实现稠化报表

PostgreSQL , Oracle , 稠化报表 , partition by outer join

背景介绍:借用Oracle的一篇例子:

<a href="http://blog.sina.com.cn/s/blog_4cef5c7b01016lm5.html">http://blog.sina.com.cn/s/blog_4cef5c7b01016lm5.html</a>

在数据库表中,存储的数据经常是稀疏数据(sparse data),而不是稠密数据(dense data)。

先来了解一下什么是稀疏数据,比如一个产品销售情况表(比如有产品名、销售时间(精确到年月)、销售量3个列),假设某个时间某些产品它没有销售,一般也不会将这些产品的销售量存储为0,而是不存储,这样在产品销售情况表中就会产生很多缺失的行(gap rows),导致的结果就是特定产品销售数据按时间维度进行排序,是不连续的,或者说此产品销售在时间序列上是有缺失的。顾名思义,稠密数据是相对于稀疏数据来说的,还是用上面的假设说明,也就是说产品在某个时间没有销售,也必须存储此产品销售情况,销售量置0存储,这样对某个特定产品来说它在时间序列就是连续的,但是事实经常不是如此,所以才有将稀疏数据稠密化的过程,数据稠密化在数据仓库应用中很常见。

例如以下报表,由于某些商品在某些月份没有销售,所以不会有记录。

Oracle 通过partition by outer join语法可以方便的实现稠化。

达到类似这样的效果

通过UDF,可以达到类似的效果:

如下

通过窗口,可以实现同比,从而实现快速的搜索到销量逆增长的商品。

详细执行计划如下:

PostgreSQL的UDF非常强大,可以实现很多功能。

当然也期待PostgreSQL直接将partition by语法引入,那就更加方便了。

<a href="https://www.postgresql.org/docs/10/static/functions-window.html">https://www.postgresql.org/docs/10/static/functions-window.html</a>

<a href="https://www.postgresql.org/docs/10/static/plpgsql.html">https://www.postgresql.org/docs/10/static/plpgsql.html</a>