首页 > 解决方案 > 在 SQL 中计算连续天数

问题描述

我有一个数据集,其中包含参加健身房的人的姓名以及他们实际去健身房的日期。我要数一数他们连续进健身房的天数。数据集如下所示。

姓名 日期
盟国 2021 年 1 月 1 日
盟国 2021 年 1 月 2 日
盟国 2021 年 1 月 3 日
盟国 2021 年 1 月 5 日
盟国 2021 年 1 月 7 日
布赖恩 2021 年 1 月 12 日
布赖恩 2021 年 1 月 13 日
布赖恩 2021 年 1 月 16 日
布赖恩 2021 年 1 月 21 日
布赖恩 2021 年 1 月 22 日

在这里,我们知道 Ally 连续 3 天去健身房(1/1/2021-1/3/2021),Brian 去了 4 天(1/12/2021-1/13/2021 和 1/21/2021-1/ 22/2021)。我希望最终结果看起来像这样。

姓名 数数
盟国 3
盟国 1
盟国 1
布赖恩 2
布赖恩 1
布赖恩 2

有没有办法在 SQL 中做到这一点?

标签: sqldategoogle-bigquery

解决方案


当日期递增 1 时,您可以从日期中减去递增值以获得常量。剩下的只是聚合。

因为您没有明确指定数据库,所以我将使用标准 SQL 语法:

select name, count(*), min(date), max(date)
from (select t.*,
             row_number() over (partition by name order by date) as seqnum
      from t
     ) t
group by name, date - seqnum * interval '1 day'
order by name, min(date);

这应该在 Postgres(接近标准 SQL)中工作。在 SQL Server 中,它将是:

group by name, dateadd(day, -seqnum, date)

推荐阅读