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

按年、月分組,彙總得到每個月的合計值,沒什麼難的,就是個常規 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 教案——有序,這些技術對提高計算性能、簡化計算編程很有幫助。

 

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

SPL能很方便地嵌入到JAVA應用,可參考《Java 如何調用 SPL 腳本》

具體使用方法可參考 《如何使用集算器》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章