# GREATEST LEAST 介紹及unpivot 技巧 ## 前言 2024-01-18我在ithelp 有發一篇GREATEST LEAST 介紹的文,[按我前往](https://ithelp.ithome.com.tw/questions/10215048). 裡面還有以前解答問題時,有應用到Oracle使用GREATEST的案例. 目前這對函數(或者說是語法),已經是ANSI標準了.Oracle,PostgreSQL,MySQL都有支援,SQL Server 在2022版有支援.大家可以多加利用.裡面有提到一個問題,其實就是unpivot的功能.unpivot 橫轉直,我在ithelp有個範例,[unpivot案例](https://ithelp.ithome.com.tw/articles/10230070?sc=pt) ## 來看hstore 的方式 ```sql= -- 先聚合,將多欄位放進hstore select hst from s0118.monthlysales as mtsl join lateral hstore(mtsl) s1(hst) on true; hst ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- "m1"=>"5632", "m2"=>"3508", "m3"=>"4767", "m4"=>"2976", "m5"=>"10722", "m6"=>"3256", "m7"=>"8357", "m8"=>"1094", "m9"=>"3617", "gal"=>"小島南", "m10"=>"6523", "m11"=>"5731", "m12"=>"8747" "m1"=>"3234", "m2"=>"10219", "m3"=>"8861", "m4"=>"9389", "m5"=>"9835", "m6"=>"8251", "m7"=>"5770", "m8"=>"10341", "m9"=>"10624", "gal"=>"佐山愛", "m10"=>"6875", "m11"=>"3426", "m12"=>"2937" "m1"=>"8219", "m2"=>"5467", "m3"=>"4453", "m4"=>"1839", "m5"=>"10604", "m6"=>"10174", "m7"=>"6401", "m8"=>"5775", "m9"=>"1203", "gal"=>"小花暖", "m10"=>"10334", "m11"=>"9901", "m12"=>"3890" (3 rows) -- 利用each 展開, 再使用 distinct on with t1 as ( select gal, 月份, 銷售::int from s0118.monthlysales as mtsl join lateral hstore(mtsl) s1(hst) on true join lateral each(hst) s2(月份, 銷售) on true where 月份 != 'gal' ) select distinct on (gal) gal , 月份 as 最高月份 , 銷售 from t1 order by gal, 銷售 desc; gal | 最高月份 | 銷售 --------+----------+------- 佐山愛 | m9 | 10624 小島南 | m5 | 10722 小花暖 | m5 | 10604 (3 rows) ``` 可以看到使用了 distinct on 的特殊語法(PG方言,非ANSI).也可以先找出max value,再join一次. ## JSON的方式 ```sql= with t1 as ( select gal, 月份, 銷售 from s0118.monthlysales as mtsl join lateral to_jsonb(mtsl) s1(jsb) on true join lateral jsonb_each(jsb) s2(月份, 銷售) on true where 月份 != 'gal' ) select distinct on (gal) gal , 月份 as 最高月份 , 銷售 from t1 order by gal, 銷售 desc; gal | 最高月份 | 銷售 --------+----------+------- 佐山愛 | m9 | 10624 小島南 | m5 | 10722 小花暖 | m5 | 10604 (3 rows) ``` hstore與json的方式,幾乎是一樣的.但是hstore的each展開的值會是text,要注意轉為int.不然使用排序 distinct on, 會有問題. ## 還有沒有其他方法? 還有一種方法,是利用 plpython的功能,但這就不是屬於unpivot的方式了. 之後分享plpython會再說明. ## 感謝 感謝 小島南,佐山愛,小花暖. ## 結語 pivot, unpivot 的方式,在這段時間分享了不少案例,對統計分析,或是報表等等應用,都可以參考.