一句話得到 SQL 難實現的去年同期比

xiaohuihui發表於2020-06-24

按年、月分組,彙總得到每個月的合計值,沒什麼難的,就是個常規 group 操作。下一步是找到去年該月,資料整齊有序的話,向上第 12 條記錄,肯定就是去年該月。但 SQL 無法單獨的表述記錄物件,也沒有集合中相對位置的計算能力,得變通成自關聯,把兩條要計算的記錄 join 成一條記錄,再做記錄內的多欄位計算:
with t as (select year(f1) y, month(f1) m, sum(f2) n
       from A
       group by y,m)
select t1.*,t1.n/t2.n r
from t t1 join t t2
       on t1.y=t2.y+1 and t1.m=t2.m

這種透過 join 把跨行計算轉換成行內計算,會增加思維負擔和解題難度。


如果使用集算器 SPL 語言就會簡單很多,它對有序集合計算就支援的比較徹底,能清楚表述集合中任意位置的記錄,透過絕對 / 相對位置定位,如下輕易描述出向上第 12 行記錄後,一行程式碼就搞定了:
=connect(”mysqlDB”).query(“select * from A”).groups(year(f1):y,month(f1):m;sum(f2):n).sort(y,m).derive(n/~[-12].n:r)

有序集合除了定位計算,還有非常規迭代聚合、有序迴圈、有序排名等多種計算手段,參考 ,這些技術對提高計算效能、簡化計算程式設計很有幫助。


當資料不在資料庫裡時,SPL 執行復雜計算仍然方便:
=file(“d:/t.csv”).import(;,",").groups...

SPL能很方便地嵌入到JAVA應用,可參考 。

具體使用方法可參考 。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69900830/viewspace-2700379/,如需轉載,請註明出處,否則將追究法律責任。

相關文章