在數據庫裏統計某個字段中相同數據直接用Group by就可以了,但如果附加個順序條件後就有點麻煩了,例如,統計每一個玩家的連勝或者連敗情況。 Oracle有窗口分析函數,需要多層嵌套加上高級分析函數才能實現,Mysql、Hive等數據庫不如Oracle強大,實現起來就比較費勁了。集算器作爲應用和數據庫的中間計算層,可以用統一的方式,很簡單就能解決此類問題。先看一個簡單的例子,表logs 如下,求num中連續 出現3次以上的數字都有哪些?
+----+-----+
| id | num |
+----+-----+
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 5 | 1 |
| 6 | 2 |
| 7 | 2 |
+----+-----+
集算器的代碼是這樣的,
A | |
1 | $select id,num from logs |
2 | =A1.group@o(num) |
3 | =A2.select(~.len()>=3).(~.num) |
A1:sql取數
A2:按照相鄰num同值分組
A3:選出至少連續出現三次相同的num
如果想知道相同連續值最大有多少條記錄,A3中的表達式改爲=A2.max(~.len())即可。
有些需求不是按順序有相同值,是按順序有相同趨勢,比如,找出連續虧損達三月或以上的那些月份的記錄,用集算器很簡單,只是把相鄰數據分組規則從等值條件改爲趨勢條件即可。代碼參考如下:
A | |
1 | =db.query("select * from 收支表 order by 月份") |
2 | =A1.group@o(收入>支出).select(~.收入<~.支出 && ~.len()>=3).conj() |
考勤記錄合併進出狀態也是類似的情況,在電商、物流和銀行也常遇到統計用戶連續交易的總額、連續登陸天數、連續登陸開始和結束時間、間隔天數等這樣的需求,都可以仿照這些例子很快實現。其實還有很多情況用SQL十分不方便,但用集算器卻很簡單,感興趣可以看看集算器優化 SQL 示例彙總 。集算器提供了Jdbc接口,Java可直接調用,使用非常方便,有關集算器安裝使用、獲得免費授權和相關技術資料,參見 如何使用集算器。