Consecutive Numbers
來源:程序員人生 發(fā)布時間:2015-08-19 08:28:07 閱讀次數(shù):3275次
Write a SQL query to find all numbers that appear at least three times consecutively.
+----+-----+
| Id | Num |
+----+-----+
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 5 | 1 |
| 6 | 2 |
| 7 | 2 |
+----+-----+
For example, given the above Logs table, 1 is the only number that appears consecutively for at least three times.
解法1:
參考[Rank Scores](http://blog.csdn.net/havedream_one/article/details/45395063)
從上往下對齊排名,如果相等,則排名相等,不相等則排名加1
代碼以下:
select num,@curRank := @curRank+IF(@preNum = num,0,1) as rank ,@preNum:=num from logs s,(select @curRank := 0) r,(select @preNum := null) p;
+------+------+--------------+
| num | rank | @preNum:=num |
+------+------+--------------+
| 1 | 1 | 1 |
| 1 | 1 | 1 |
| 1 | 1 | 1 |
| 2 | 2 | 2 |
| 1 | 3 | 1 |
| 2 | 4 | 2 |
| 2 | 4 | 2 |
+------+------+--------------+
如上所示,如果1個num的連續(xù)排名超過3則符合題意。
select num,count(rank) as count from (
select num,@curRank := @curRank+IF(@preNum = num,0,1) as rank ,@preNum:=num from logs s,(select @curRank := 0) r,(select @preNum := null) p ) t
group by rank;
+------+-------+
| num | count |
+------+-------+
| 1 | 3 |
| 2 | 1 |
| 1 | 1 |
| 2 | 2 |
+------+-------+
得到上述的表以后,再使用having條件選擇。
終究結(jié)果:
select distinct num from(
select num,count(rank) as count from (
select num,@curRank := @curRank+IF(@preNum = num,0,1) as rank ,@preNum:=num from logs s,(select @curRank := 0) r,(select @preNum := null) p ) t
group by rank having count >= 3;
) tmp;
解法2:
1、從第1條記錄搜索,前后相同,count++,不相等,count=1;
2、判斷,若rank大于3則符合題意
select distinct num
from (
select num,@curRank := @preRank+IF(@preNum = num,1,0),@preRank :=IF(@preNum = num,@curRank,1) as rank,@preNum := num
from Logs s,(select @preRank := 1) r,(select @preNum := null) p
) t
where rank >= 3;
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學習有所幫助,可以手機掃描二維碼進行捐贈