SQL 计算日期最长的连续天数 table
SQL count longest consecutive days with dates table
我有一个登录名 table,其中包含 UserID 和 login_date 列,如下所示(但有数千个条目)。我如何找到每个用户最长的连续登录记录以及这些记录的开始和结束日期?
编辑:使用 Postgres。删除了有关只计算 M-F 而不是周末的连续上垒的问题(我是否单独 post 讨论过?)
UserID login_date
112 2020-03-14
131 2020-07-26
112 2019-03-15
323 2019-02-28
639 2019-02-09
您可以将其作为间隙和孤岛问题来解决。假设每天登录一次(如示例数据),可以减去一个枚举序列,连续几天该值是常数。
在标准 SQL 中,所有序列的逻辑如下所示:
select userid, min(login_date), max(login_date)
from (select t.*,
row_number() over (partition by userid order by login_date) as seqn
from t
) t
group by userid, login_date - seqnum * interval '1 day';
在 Postgres 中,您实际上可以使用 distinct on
:
获得最长的时间
select distinct on (userid) userid, min(login_date), max(login_date)
from (select t.*,
row_number() over (partition by userid order by login_date) as seqn
from t
) t
group by userid, login_date - seqnum * interval '1 day'
order by userid, count(*) desc;
注意:如果 user/day 组合重复,请使用 dense_rank()
而不是 row_number()
。
如果要处理周末和节假日,那么建议使用日历table。
我有一个登录名 table,其中包含 UserID 和 login_date 列,如下所示(但有数千个条目)。我如何找到每个用户最长的连续登录记录以及这些记录的开始和结束日期?
编辑:使用 Postgres。删除了有关只计算 M-F 而不是周末的连续上垒的问题(我是否单独 post 讨论过?)
UserID login_date
112 2020-03-14
131 2020-07-26
112 2019-03-15
323 2019-02-28
639 2019-02-09
您可以将其作为间隙和孤岛问题来解决。假设每天登录一次(如示例数据),可以减去一个枚举序列,连续几天该值是常数。
在标准 SQL 中,所有序列的逻辑如下所示:
select userid, min(login_date), max(login_date)
from (select t.*,
row_number() over (partition by userid order by login_date) as seqn
from t
) t
group by userid, login_date - seqnum * interval '1 day';
在 Postgres 中,您实际上可以使用 distinct on
:
select distinct on (userid) userid, min(login_date), max(login_date)
from (select t.*,
row_number() over (partition by userid order by login_date) as seqn
from t
) t
group by userid, login_date - seqnum * interval '1 day'
order by userid, count(*) desc;
注意:如果 user/day 组合重复,请使用 dense_rank()
而不是 row_number()
。
如果要处理周末和节假日,那么建议使用日历table。