最近工作中用到mysql,發現mysql和Oracle差別挺大的,其不像Oracle中存在豐富的分析函數(開窗函數),如rank(),lag(),leaf()等,只能用變量來獲取以便達到分析函數的效果,具體使用方法如下:
eg:
想通過member id進行分組,獲取每個用戶最新首次操作的時間,實際上就是根據member id分組后取出最早的一條,但是由於沒有分析函數不能快速實現,只能用這種方式操作。
select t2.member_id, t2.created_time time from (select t1.id,
t1.member_id,
t1.created_time,
@rownum := @rownum + 1,
if(@member_id = t1.member_id, @rank := @rank + 1, @rank := 1) as rank,
@member_id := t1.member_id
from (select id, member_id, created_time
from t01_et_open_account_step_log
where step = 310
order by member_id asc, created_time asc) t1,
(select @rownum := 0, @member_id := null, @rank := 0) t0) t2 where t2.rank = 1; ORDER BY t2.member_id asc
運行結果:
也許直接看代碼不夠清晰,先執行里層
select t1.id,
t1.member_id,
t1.created_time,
@rownum := @rownum + 1,
if(@member_id = t1.member_id, @rank := @rank + 1, @rank := 1) as rank,
@member_id := t1.member_id
from (select id, member_id, created_time
from t01_et_open_account_step_log
where step = 310
order by member_id asc, created_time asc) t1,
(select @rownum := 0, @member_id := null, @rank := 0) t0
運行結果:
兩者對比較很容易理解mysql中變量@的使用,相當於將Oracle中的分析函數是效果一樣的,相當於細分來執行每一步動作,個人感覺這里和Oracle中lag()函數原理很像。