Mysql刷題筆記 12.22 求每個使用者相鄰兩次瀏覽時間之差小於三分鐘的次數 兩種方法
阿新 • • 發佈:2020-12-23
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;