1285. 找到连续区间的开始和结束数字
表:Logs
+---------------+---------+ | Column Name | Type | +---------------+---------+ | log_id | int | +---------------+---------+ id 是上表具有唯一值的列。 上表的每一行包含日志表中的一个 ID。
编写解决方案,得到 Logs
表中的连续区间的开始数字和结束数字。
返回结果表按照 start_id
排序。
结果格式如下面的例子。
示例 1:
输入: Logs 表: +------------+ | log_id | +------------+ | 1 | | 2 | | 3 | | 7 | | 8 | | 10 | +------------+ 输出: +------------+--------------+ | start_id | end_id | +------------+--------------+ | 1 | 3 | | 7 | 8 | | 10 | 10 | +------------+--------------+ 解释: 结果表应包含 Logs 表中的所有区间。 从 1 到 3 在表中。 从 4 到 6 不在表中。 从 7 到 8 在表中。 9 不在表中。 10 在表中。
像这种找连续区间都可以用这种方式解决:
select
min(t.log_id) as start_id,
max(t.log_id) as end_id
from(
select distinct
log_id,
log_id - ROW_NUMBER() OVER ( ORDER BY log_id ASC ) reference
from Logs
) as t
group by t.reference
1405. 活跃用户
表 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 是活跃用户.
这个解法也差不多,但是难一点,用data_sub(,interval Day/Week/Month)来减去时间
select distinct
a.id as id,
Accounts.name as name
from(
select
L.id,
date_sub(L.login_date, interval row_number() over (partition by L.id order by L.login_date)Day) as ref
from (
select
Logins.id,
Logins.login_date
from
Logins
group by Logins.id,Logins.login_date
) as L
) as a left join Accounts on a.id = Accounts.id
group by a.id,a.ref
having count(*) >= 5
order by a.id