表 Accounts
:
+---------------+---------+ | Column Name | Type | +---------------+---------+ | id | int | | name | varchar | +---------------+---------+ id 是该表主键(具有唯一值的列) 该表包含账户 id 和账户的用户名.
表 Logins
:
+---------------+---------+ | Column Name | Type | +---------------+---------+ | id | int | | login_date | date | +---------------+---------+ 该表可能包含重复项. 该表包含登录用户的账户 id 和登录日期. 用户也许一天内登录多次.
活跃用户 是指那些至少连续 5 天登录账户的用户。
编写解决方案, 找到 活跃用户 的 id 和 name。
返回的结果表按照 id
排序 。
结果表格式如下例所示。
示例 1:
输入: Accounts 表: +----+----------+ | id | name | +----+----------+ | 1 | Winston | | 7 | Jonathan | +----+----------+ Logins 表: +----+------------+ | id | login_date | +----+------------+ | 7 | 2020-05-30 | | 1 | 2020-05-30 | | 7 | 2020-05-31 | | 7 | 2020-06-01 | | 7 | 2020-06-02 | | 7 | 2020-06-02 | | 7 | 2020-06-03 | | 1 | 2020-06-07 | | 7 | 2020-06-10 | +----+------------+ 输出: +----+----------+ | id | name | +----+----------+ | 7 | Jonathan | +----+----------+ 解释: id = 1 的用户 Winston 仅仅在不同的 2 天内登录了 2 次, 所以, Winston 不是活跃用户. id = 7 的用户 Jonathon 在不同的 6 天内登录了 7 次, , 6 天中有 5 天是连续的, 所以, Jonathan 是活跃用户.
进阶问题:
如果活跃用户是那些至少连续 n
天登录账户的用户, 你能否写出通用的解决方案?
# Write your MySQL query statement below
WITH t AS
(SELECT *,
SUM(id) over(partition by id
ORDER BY login_date range interval 4 day preceding)/id cnt
FROM
(SELECT DISTINCT *
FROM Accounts
JOIN Logins using(id) ) tt )
SELECT DISTINCT id,
name
FROM t
WHERE cnt=5;