MySQL查询:统计指定用户最后连续有IN状态的天数
统计用户最后一段连续有IN状态的天数SQL查询
表结构与示例数据
| userId | dateTime | status |
|---|---|---|
| user1 | 2022-07-10 06:54:41 | 'IN' |
| user1 | 2022-07-10 12:54:41 | 'OUT' |
| user1 | 2022-07-11 06:54:41 | 'IN' |
| user1 | 2022-07-11 12:54:41 | 'OUT' |
| user3 | 2022-07-11 06:54:41 | 'IN' |
| user3 | 2022-07-11 11:00:41 | 'OUT' |
| user2 | 2022-07-11 07:00:41 | 'IN' |
| user2 | 2022-07-11 15:00:41 | 'OUT' |
| user1 | 2022-07-13 06:54:41 | 'IN' |
| user1 | 2022-07-13 12:54:41 | 'OUT' |
| user1 | 2022-07-15 06:54:41 | 'IN' |
| user1 | 2022-07-15 06:54:41 | 'OUT' |
| user1 | 2022-07-16 06:54:41 | 'IN' |
| user1 | 2022-07-16 06:54:41 | 'OUT' |
需求说明
筛选user1时,统计该用户最后一段连续存在IN状态的天数,示例数据中结果为2。
SQL查询语句
SELECT COUNT(*) AS consecutive_days FROM ( SELECT date_only, DATE_SUB(date_only, INTERVAL ROW_NUMBER() OVER(ORDER BY date_only) DAY) AS group_key FROM ( -- 提取user1所有有IN状态的日期,去重 SELECT DISTINCT DATE(dateTime) AS date_only FROM your_table_name WHERE userId = 'user1' AND status = 'IN' ) AS user_dates ) AS grouped_dates GROUP BY group_key ORDER BY MAX(date_only) DESC LIMIT 1;
语句说明
- 内层子查询
user_dates:提取user1所有存在IN状态的日期,通过DISTINCT确保同一天只算一次。 - 中间层
grouped_dates:利用ROW_NUMBER()生成按日期排序的行号,用日期减去行号得到分组键——连续的日期会生成相同的group_key,以此区分不同的连续日期段。 - 外层查询:按
group_key分组后,取最大日期最新的分组,统计该分组的记录数即为最后一段连续天数。
注意:如果
status字段实际存储值不带单引号,需将status = 'IN'调整为status = IN(或status = "IN"),匹配实际数据格式。
内容的提问来源于stack exchange,提问作者Ivan Faber Cavallo
相关产品推荐
相关产品推荐

