1. 程式人生 > 其它 >Mysql刷題筆記 12.22 求每個使用者相鄰兩次瀏覽時間之差小於三分鐘的次數 兩種方法

Mysql刷題筆記 12.22 求每個使用者相鄰兩次瀏覽時間之差小於三分鐘的次數 兩種方法

技術標籤:mysqlmysql資料庫

Mysql練習

-- 12.22 求每個使用者相鄰兩次瀏覽時間之差小於三分鐘的次數

T1221
+---------+---------------------+
| user_id | times               |
+---------+---------------------+
|       1 | 2020-12-07 21:13:07 |
|       1 | 2020-12-07 21:15:26 |
|       1 | 2020-12-07 21:17:44 |
|       2 | 2020-12-13 21:14:06 |
| 2 | 2020-12-13 21:18:19 | | 2 | 2020-12-13 21:20:36 | | 3 | 2020-12-21 21:16:51 | | 4 | 2020-12-16 22:22:08 | | 4 | 2020-12-02 21:17:22 | | 4 | 2020-12-30 15:15:44 | | 4 | 2020-12-30 15:17:57 | +---------+---------------------+ 結果: +---------+------+ | user_id | cnt | +---------+------+
| 1 | 2 | | 2 | 1 | | 3 | 0 | | 4 | 1 | +---------+------+ 方法一: 1. 首先兩張相同的表 按照相同的id 做左連線 找到符合條件的相鄰兩次時間小於三分鐘的 2. 對每個使用者進行分組 計算滿足條件的次數 3. 為了讓user_id = 3的也顯示出來 再做一個左連線 如果是null 則返回0 select t4.user_id,IFNULL(t3.c,0) as cnt from T1222 t4 left join ( select t1.user_id,
count(t1.times)as c from t1222 t1 left join t1222 t2 on t1.user_id = t2.user_id where t1.times < t2.times and DATE_ADD(t1.times,INTERVAL 3 MINUTE) > t2.times group by t1.user_id )t3 on t4.user_id = t3.user_id group by t4.user_id; ------------------------------------------------------ select t1.user_id,sum(case when DATE_ADD(t1.times,INTERVAL 3 MINUTE) > t2.times and t1.times < t2.times then 1 else 0 end) as cnt from t1222 t1 left join t1222 t2 on t1.user_id = t2.user_id group by t1.user_id 方法二: 1. 先建立一個檢視 運用視窗函式 按照user分組 按照時間排序 產生排序數字rn 2. 對這兩個檢視做左連線 要求比較的時間是連續的 避免了方法1中全部連線 3. 計算兩個相鄰時間的差值 為cn 4. 統計差值小於3的個數 create view tt as (select row_number() over(partition by user_id order by times) rn,user_id,times from T1222 group by user_id,times) -- mysql 的TIMESTAMPDIFF(MINUTE,starttime,endtime)函式獲得時間差, -- 得到的可以是DAY/天,HOUR/小時,MINUTE/分鐘,SECOND/秒。 -- 其中starttime為時間小的那個時間,endtime為時間大的時間。 select c.user_id,sum(case when c.cn < 3 then 1 else 0 end) cnt from ( select a.user_id, ABS(TIMESTAMPDIFF(minute,IFNULL(a.times,'1970-01-01 00:00:00'),IFNULL(b.times,'1970-01-01 00:00:00'))) cn from tt as a left join tt as b on a.rn = b.rn+1 and a.user_id = b.user_id )c group by c.user_id;