查詢連續三天登入問題
阿新 • • 發佈:2021-09-06
解決問題:要求使用sql查詢出連續三天登入的使用者
1.建表:
CREATE TABLE `tmp` ( `name` varchar(255) NOT NULL, `login_date` datetime DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
2.插入資料:
1 INSERT INTO `tmp`(`name`, `login_date`) VALUES ('a', '2021-09-02 00:00:00'); 2 INSERT INTO `tmp`(`name`, `login_date`) VALUES('a', '2021-09-03 00:00:00'); 3 INSERT INTO `tmp`(`name`, `login_date`) VALUES ('a', '2021-09-04 00:00:00'); 4 INSERT INTO `tmp`(`name`, `login_date`) VALUES ('a', '2021-09-05 00:00:00'); 5 INSERT INTO `tmp`(`name`, `login_date`) VALUES ('a', '2021-09-06 00:00:00'); 6 INSERT INTO `tmp`(`name`, `login_date`) VALUES ('b', '2021-09-01 00:00:00'); 7 INSERT INTO `tmp`(`name`, `login_date`) VALUES ('b', '2021-09-03 00:00:00'); 8 INSERT INTO `tmp`(`name`, `login_date`) VALUES ('b', '2021-09-04 00:00:00'); 9 INSERT INTO `tmp`(`name`, `login_date`) VALUES ('b', '2021-09-06 00:00:00'); 10 INSERT INTO `tmp`(`name`, `login_date`) VALUES ('c', '2021-09-05 00:00:00'); 11 INSERT INTO`tmp`(`name`, `login_date`) VALUES ('c', '2021-09-06 00:00:00');
思路一:
先使用 ROW_NUMBER 函式求出同一個人登陸時間的排名,再使用 DATE_SUB 函式求出登陸時間減去排名(開始連續登陸時間),最後進行 GROUP BY 求出連續登入次數。
SELECT name, count(1) AS cnt FROM (SELECT a.name, a.login_date, a.ra, date_sub(a.login_date, INTERVAL a.ra DAY) AS interval_days FROM (SELECT name, login_date, ROW_NUMBER() OVER(PARTITION BY name ORDER BY login_date) AS ra FROM tmp) a)b GROUP BY name, interval_days HAVING counT(1) >= 3;
思路二:
使用 LEAD() OVER() 函式獲取排名2位後的登陸時間,再使用 DATEDIFF 函式求出後2位登陸時間和登陸時間相差2的名字,去重。
SELECT DISTINCT a.name FROM (SELECT name, login_date, LEAD(login_date,2) OVER(PARTITION BY name ORDER BY login_date) AS lag_2days FROM tmp ORDER BY name,login_date)a WHERE DATEDIFF(a.lag_2days,a.login_date) = 2;