天天看點

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>