MySQL連續範圍問題
MySQL技術內幕 SQL程式設計 58頁
首先建立實驗表
create table t(a int primary key);
insert into t values(1);
insert into t values(2);
insert into t values(3);
insert into t values(100);
insert into t values(101);
insert into t values(103);
insert into t values(104);
insert into t values(105);
commit;
實驗目標是求數字的連續範圍,以上面的資料為例,應該求得的連續範圍為
1-3
100-101
103-105
第一步,給資料增加行號
select a,@a:=@a+1 rn from t,(select @a:=0) as a;
第二步,求得資料與行號的差值
第三步 獲得結果
用之前的簽到實驗說明這個連續範圍的用法.
http://blog.itpub.net/29254281/viewspace-1379159/
award_chance_history是活動的簽到表,userid記錄使用者的ID,createtime記錄使用者的簽到時間.
實驗求每個使用者的連續簽到時間.
第一步,獲取使用者每天的簽到情況
獲取使用者簽到時間和現在時間的差值,並且用distinct過濾使用者在一天內多次簽到的記錄
select
distinct
userid,
date_format(createtime,'%Y-%m-%d') createtime,
datediff(createtime,now()) diff
from award_chance_history order by userid,createtime
第二步,模擬分析函式,每個使用者都產生一個自己的序列
select
b.*,
@gid := @cgid,
@cgid := b.userid,
if(@gid = @cgid, @rank := @rank + 1, @rank := 1) rank,
b.diff-@rank flag from (
select
distinct
userid,
date_format(createtime,'%Y-%m-%d') createtime,
datediff(createtime,now()) diff
from award_chance_history order by userid,createtime
) b, (SELECT @gid := 1, @cgid := 1, @rank := 1) as a
diff和rank序列相減,作為flag欄位,flag相同說明使用者是連續簽到.
如下圖的249使用者,在16,17日連續簽到,他們的flag都是-16.
第三步,根據分組得到連續簽到的結果
第四步,求每個使用者最長的連續簽到時間段
在第三步的基礎上,再模擬一次分析函式
首先建立實驗表
create table t(a int primary key);
insert into t values(1);
insert into t values(2);
insert into t values(3);
insert into t values(100);
insert into t values(101);
insert into t values(103);
insert into t values(104);
insert into t values(105);
commit;
實驗目標是求數字的連續範圍,以上面的資料為例,應該求得的連續範圍為
1-3
100-101
103-105
第一步,給資料增加行號
select a,@a:=@a+1 rn from t,(select @a:=0) as a;
第二步,求得資料與行號的差值
-
select a,rn,a-rn diff from
-
(
-
select a,@a:=@a+1 rn from t,(select @a:=0) as a
-
- ) b;
第三步 獲得結果
-
select min(a) start_range,max(a) end_range
-
from
-
(
-
select a,rn,a-rn diff from
-
(
-
select a,@a:=@a+1 rn from t,(select @a:=0) as a
-
) b
- ) c group by diff;
用之前的簽到實驗說明這個連續範圍的用法.
http://blog.itpub.net/29254281/viewspace-1379159/
award_chance_history是活動的簽到表,userid記錄使用者的ID,createtime記錄使用者的簽到時間.
實驗求每個使用者的連續簽到時間.
-
create table award_chance_history
-
(
-
id int primary key auto_increment,
-
userid int,
-
createtime datetime
-
);
-
-
insert into award_chance_history(userid,createtime)
- select ceil(rand()*10000),str_to_date('2014-12-15','%Y-%m-%d')+interval ceil(rand()*10000) minute from nums where id<30;
-
insert into award_chance_history(userid,createtime)
-
select userid,createtime + interval ceil(rand()*10) day from award_chance_history,nums
- where nums.id <10 order by rand() limit 150;
第一步,獲取使用者每天的簽到情況
獲取使用者簽到時間和現在時間的差值,並且用distinct過濾使用者在一天內多次簽到的記錄
select
distinct
userid,
date_format(createtime,'%Y-%m-%d') createtime,
datediff(createtime,now()) diff
from award_chance_history order by userid,createtime
第二步,模擬分析函式,每個使用者都產生一個自己的序列
select
b.*,
@gid := @cgid,
@cgid := b.userid,
if(@gid = @cgid, @rank := @rank + 1, @rank := 1) rank,
b.diff-@rank flag from (
select
distinct
userid,
date_format(createtime,'%Y-%m-%d') createtime,
datediff(createtime,now()) diff
from award_chance_history order by userid,createtime
) b, (SELECT @gid := 1, @cgid := 1, @rank := 1) as a
diff和rank序列相減,作為flag欄位,flag相同說明使用者是連續簽到.
如下圖的249使用者,在16,17日連續簽到,他們的flag都是-16.
第三步,根據分組得到連續簽到的結果
-
select userid,min(c.createtime),max(c.createtime),count(*) from
-
(
-
select
-
b.*,
-
@gid := @cgid,
-
@cgid := b.userid,
-
if(@gid = @cgid, @rank := @rank + 1, @rank := 1) rank,
-
b.diff-@rank flag from (
-
select
-
distinct
-
userid,
-
date_format(createtime,'%Y-%m-%d') createtime,
-
datediff(createtime,now()) diff
-
from award_chance_history order by userid,createtime
-
) b, (SELECT @gid := 1, @cgid := 1, @rank := 1) as a
- ) c group by userid,flag;
第四步,求每個使用者最長的連續簽到時間段
在第三步的基礎上,再模擬一次分析函式
-
select * from (
-
select d.*,
-
@ggid := @cggid,
-
@cggid := d.userid,
-
if(@ggid = @cggid, @grank := @grank + 1, @grank := 1) grank
-
from
-
(
-
select userid,min(c.createtime) begin_date ,max(c.createtime) end_date,count(*) c from
-
(
-
select
-
b.*,
-
@gid := @cgid,
-
@cgid := b.userid,
-
if(@gid = @cgid, @rank := @rank + 1, @rank := 1) rank,
-
b.diff-@rank flag from (
-
select
-
distinct
-
userid,
-
date_format(createtime,'%Y-%m-%d') createtime,
-
datediff(createtime,now()) diff
-
from award_chance_history order by userid,createtime
-
) b, (SELECT @gid := 1, @cgid := 1, @rank := 1) as a
-
) c group by userid,flag
-
order by userid,count(*) desc
-
) d,(SELECT @ggid := 1, @cggid := 1, @grank := 1) as e
-
)f
- where grank=1;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1385638/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL 缺失範圍問題MySql
- MySQL 間斷範圍問題MySql
- 關於數字的經典SQL程式設計:連續範圍問題SQL程式設計
- SQL根據分組求連續範圍SQL
- JAVA實現附近範圍內公交定位問題Java
- MySQL欄位的取值範圍MySql
- MySQL限制IP網段範圍從遠端訪問的方法MySql
- MySQL SSL連線問題MySql
- Mysql 左連結問題MySql
- jive 連線 mysql 問題MySql
- MySQL取得某一範圍隨機數MySql隨機
- 三角函式:基礎知識&&Omega範圍問題函式
- jdbc連線mysql問題-helpJDBCMySql
- MySQL8.0之跳躍範圍掃描MySql
- MySQL運維8-Mycat範圍分表MySql運維
- SonarQube系列-透過配置掃描分析範圍,聚焦關鍵問題
- 效能問題往往出現在開發人員可控範圍之外
- 關於mysql連線的問題MySql
- JDBC連線MySQL失效的問題JDBCMySql
- MySQL中各種欄位的取值範圍(轉)MySql
- 公司公司程式碼業務範圍成本控制範圍概念
- 隨機範圍小數和隨機範圍整數隨機
- rac 本地監聽問題導致資料斷斷續續連線
- 關於 Homestead 連線 MySQL 問題MySql
- weblogic +mysql 連線池 中文問題??WebMySql
- 基於tcp的http應用,斷點續傳,範圍請求TCPHTTP斷點
- mysql啟動不了,mysql連線不上,問題排查MySql
- JavaScript 拖拽限定範圍JavaScript
- SciPy 應用範圍
- groovy之範圍特性
- oracle hint有效範圍Oracle
- 關於聯合索引,範圍查詢,時間列索引的幾個問題索引
- Delphi連線mysql中文字元問題MySql字元
- 解決jdbc不能重連mysql的問題JDBCMySql
- mysql8 無法連線navicat問題MySql
- MySQL next-key lock 加鎖範圍是什麼?MySql
- mysql int(3)與int(10)的數值範圍相同嗎?MySql
- sql關於連續日期的統計報表問題SQL