sql - 在 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 中做到这一点?
解决方案
当日期递增 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)
推荐阅读
- docker - docker中的Gradle构建太慢了
- python - 如何通过在python中的子进程调用中给出外部命令来打开文件?
- javascript - 为什么我收到错误:405:JavaScript 和 PHP 中的异步通信中不允许的方法
- python - 如何从谷歌colab的数据框中正确获取excel中的所有数据
- vba - 使用 VBA 进行字符串操作中的双引号问题
- javascript - 在链接悬停时更改视频
- spring-boot - 无效的内容类型:文本/html - SOAP 客户端
- c# - Linq 查询以根据另一列更新值
- java - 我们应该使用带有静态方法的 Spring @Bean 吗?
- php - 使用自定义作曲家包找不到类