1. 程式人生 > 其它 >查詢連續三天登入問題

查詢連續三天登入問題

解決問題:要求使用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;